次のコマンドを実行しようとしています。
for i in test1.txt do awk '$1==$i {sum +=$4}END {print sum}' test2.txt
そのうち test1.txt は次のようになります。
A
B
C
D
E
しかし、これはうまくいきません。私が達成したいことはテスト1.txtファイル、すべての行を検索test2.txt最初の列に同じ文字がある行、この行の場合は4番目の列のすべての値を追加します。
答え1
ここではawk
単独で使用できます。
awk 'NR==FNR{a[$1]++; next} ($1 in a) {sum+=$4} END{print sum}' file1.txt file2.txt
答え2
これが作成した方法で機能しない理由は、「番目のフィールド」とawk
解釈され、その変数に値がないため、エラーが発生した場合、またはGNUまたはを使用している場合は同じです。これは完全な行なので(またはGNUを使用すると、プログラムは最初の列が行全体と同じ行を探します)。$i
i
awk
i
awk
mawk
$i
$0
mawk
awk
代わりにシェル変数を次に「インポートします」awk
。
awk -v i="$i" '$1 == i { sum += $4 } END { print sum }' test2.txt
また、シェル変数の値は単に$i
ファイル名になりますtest1.txt
(それが繰り返されるので)。
サイクルコンテンツファイル:
while IFS= read -r i; do
awk ...as above...
done <test1.txt
αГsнιnの答えシェルループを使用せずにこれを行う方法を示します。