将匹配的字符串附加到特定行(sed / bash)

时间:2012-09-05 06:09:22

标签: bash shell sed awk

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

我在这里做错了什么?有没有更好的方法来实现这一目标?

提前谢谢。

3 个答案:

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