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

Unix 使用AWK/SED基于唯一ID连接两个变量,unix,sed,awk,ksh,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 " o

我有两个变量,它们是逗号分隔的列表。我想通过根据这两个变量的唯一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的高手,虽然我可以解密它,但我仍然很难想出命令。如果你能帮忙,那就太好了

使用
awk
: 测试: 使用
加入
,如
@kevin
所述。这是一个简化的版本。
join-t,如果未设置为
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

这可能适合您:

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
output=$(echo“$var1”|
sed's|^\([^,]*,\)\(.*\)/^\1/s/^[^,]*,\\(.\\)/\1\2,\\1/;$a\/^$/d'

sed-f-你需要sed或awk有什么特别的原因吗?不是真的,只是假设这是要使用的工具,或者这个
join-t,显然是最简单的方法。即使我要求sed或awk,连接似乎要简单得多。我喜欢简单的代码:)我的眼睛…我的眼睛…:+1(只是bcoz是你和sed)
[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
$ 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
sort in1 > in1.sorted
sort in2 > in2.sorted
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