使用AWK / SED基于唯一ID连接两个变量

时间:2012-01-19 20:58:36

标签: unix sed awk ksh

我有两个逗号分隔列表的变量。我想通过根据其唯一ID附加行来加入这两个变量。

以下示例:

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 个答案:

答案 0 :(得分:4)

如果您未设置sedawk,则可以使用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选项,否则请使用。

请注意,文件需要进行排序,如果尚未排序,则可以使用sort命令。

sort in1 > in1.sorted
sort in2 > in2.sorted

答案 1 :(得分:3)

这可能对您有用:

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 :(得分:2)

使用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