Объединение двух переменных на основе уникального идентификатора с использованием AWK / SED - PullRequest
2 голосов
/ 20 января 2012

У меня есть две переменные, которые являются списками, разделенными запятыми. Я хотел бы объединить эти две переменные, добавив строки на основе их уникального идентификатора.

Пример ниже:

var1="
id1,data1,data2,data3
id2,data1,data2,data3
id3,data1,data2,data3
id4,data1,data2,data3
"

var 2="
id1,data4,data5,data6
id2,data4,data5,data6
id3,data4,data5,data6
id4,data4,data5,data6
"

output="
id1,data1,data2,data3,data4,data5,data6
id2,data1,data2,data3,data4,data5,data6
id3,data1,data2,data3,data4,data5,data6
id4,data1,data2,data3,data4,data5,data6
"

Я не лучший в AWK, и хотя я могу расшифровать его, у меня все еще есть проблемы с командами. Если бы вы могли помочь, это было бы здорово!

Ответы [ 3 ]

4 голосов
/ 20 января 2012

Если вы не настроены на sed или awk, вы можете использовать join:

$ cat in1
id1,data1,data2,data3
id2,data1,data2,data3
id3,data1,data2,data3
id4,data1,data2,data3
x
$ cat in2
id1,data4,data5,data6
id2,data4,data5,data6
id3,data4,data5,data6
id4,data4,data5,data6
y
$ join -t, -j1 in1 in2
id1,data1,data2,data3,data4,data5,data6
id2,data1,data2,data3,data4,data5,data6
id3,data1,data2,data3,data4,data5,data6
id4,data1,data2,data3,data4,data5,data6
$ join -t, -a1 -a2 -j1 in1 in2
id1,data1,data2,data3,data4,data5,data6
id2,data1,data2,data3,data4,data5,data6
id3,data1,data2,data3,data4,data5,data6
id4,data1,data2,data3,data4,data5,data6
x
y

Используйте опции -a1 -a2, если хотите видеть несопоставленные линии, в противном случае не используйте't.

Обратите внимание, что файлы должны быть отсортированы, если они еще не сделаны, вы можете использовать для этого команду sort.

sort in1 > in1.sorted
sort in2 > in2.sorted
3 голосов
/ 20 января 2012

Это может работать для вас:

output=$(echo "$var1" | 
sed 's|^\([^,]*,\)\(.*\)|/^\1/s/^[^,]*,\\(.*\\)/\1\2,\\1/|;$a\/^$/d' | 
sed -f - <(echo "$var2"))
echo "$output"
id1,data1,data2,data3,data4,data5,data6
id2,data1,data2,data3,data4,data5,data6
id3,data1,data2,data3,data4,data5,data6
id4,data1,data2,data3,data4,data5,data6
2 голосов
/ 20 января 2012

Использование awk:

#!/usr/bin/awk -f

# Set the Field Separator to "," and Output FS to ","
BEGIN{
        FS=","; OFS="," 
        }

# Store each line of file1 to an array a, indexed at $1        
NR==FNR{
            a[$1]=$0;next 
            } 

# Check if the column 1 of file2 is present in that array. Print if it is.        
($1 in a){  
            print a[$1],$2,$3,$4
            }

Тест:

[jaypal:~/Temp] cat f1
id1,data1,data2,data3
id2,data1,data2,data3
id3,data1,data2,data3
id4,data1,data2,data3
[jaypal:~/Temp] cat f2
id1,data4,data5,data6
id2,data4,data5,data6
id3,data4,data5,data6
id4,data4,data5,data6
[jaypal:~/Temp] ./s.awk f1 f2
id1,data1,data2,data3,data4,data5,data6
id2,data1,data2,data3,data4,data5,data6
id3,data1,data2,data3,data4,data5,data6
id4,data1,data2,data3,data4,data5,data6

Использование join как указано @kevin. Вот упрощенная версия.

join -t, <(sort file1) <(sort file2)

Тест:

[jaypal:~/Temp] join -t, <(sort f1) <(sort f2)
id1,data1,data2,data3,data4,data5,data6
id2,data1,data2,data3,data4,data5,data6
id3,data1,data2,data3,data4,data5,data6
id4,data1,data2,data3,data4,data5,data6
...