使用bash / sed,我正在尝试搜索匹配的字符串,当找到匹配项时,它会将该变量附加到适用行的末尾。
两个清单:
[linuxbox tmp]$ cat lista
a 23
c 4
e 55
b 2
f 44
d 74
[linuxbox tmp]$ cat listb
a 3
e 34
c 84
b 1
f 500
d 666666
#!/bin/bash
rm -rf listc
cat listb |while read rec
do
var1="$(echo $rec | awk '{ print $1 }')"
var2="$(echo $rec | awk '{ print $2 }')"
if egrep "^$var1" lista; then
sed "/^$var1/ s/$/ $var2/1" lista >> listc
fi
done
当我运行它时,我得到:
[linuxbox tmp]$ ./blah.sh
a 23
e 55
c 4
b 2
f 44
d 74
[linuxbox tmp]$ cat listc
a 23 3
c 4
e 55
b 2
f 44
d 74
a 23
c 4
e 55 34
b 2
f 44
d 74
a 23
c 4 84
e 55
b 2
f 44
d 74
a 23
c 4
e 55
b 2 1
f 44
d 74
a 23
c 4
e 55
b 2
f 44 500
d 74
a 23
c 4
e 55
b 2
f 44
d 74 666666
我想要的输出是:
a 23 3
e 55 34
c 4 84
b 2 1
f 44 500
d 74 666666
我在这里做错了什么?有没有更好的方法来实现这一目标?
提前谢谢。
答案 0 :(得分:1)
如果您不介意获取已排序的输出:
join <(sort lista) <(sort listb)
答案 1 :(得分:0)
使用awk
的一种方式:
awk 'FNR==NR { array[$1]=$2; next } { if ($1 in array) print $1, array[$1], $2 }' lista listb
结果:
a 23 3
e 55 34
c 4 84
b 2 1
f 44 500
d 74 666666
答案 2 :(得分:0)
根据您的输入文件(单个文件中没有重复的键),以下内容将起到作用:
>> for key in $(awk '{print $1}' lista) ; do
+> echo $key $(awk -vK=$key '$1==K{$1="";print}' lista listb)
+> done
a 23 3
c 4 84
e 55 34
b 2 1
f 44 500
d 74 666666