1

bash/sed を使用して、一致する文字列を検索しようとしています。一致が見つかると、その変数が該当する行の末尾に追加されます。

2 つのリスト:

[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 に答える