本文にawkコマンドを含むForループは機能しません。

本文にawkコマンドを含むForループは機能しません。

次のコマンドを実行しようとしています。

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を使用すると、プログラムは最初の列が行全体と同じ行を探します)。$iiawkiawkmawk$i$0mawkawk

代わりにシェル変数を次に「インポートします」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の答えシェルループを使用せずにこれを行う方法を示します。

関連情報