我有两个逗号分隔列表的变量。我想通过根据其唯一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,虽然我可以解密它但我仍然遇到麻烦的命令。如果你能帮到那就太好了!
答案 0 :(得分:4)
如果您未设置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
选项,否则请使用。
请注意,文件需要进行排序,如果尚未排序,则可以使用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