1

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

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

先感谢您。

4

3 回答 3

1

如果您不介意获得排序输出:

join <(sort lista) <(sort listb)
于 2012-09-05T06:24:19.340 回答
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
于 2012-09-05T06:23:53.073 回答
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
于 2012-09-05T06:26:30.863 回答