同じ拡張子の一連のファイルに AWK を適用する
-
05-07-2019 - |
質問
拡張子が「*.txt」のファイルに次の「awk」コマンドを適用したい
awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'
しかし、なぜこのコマンドが機能しないのか:
for i in *.txt do echo awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done
通常は、
awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' file1.txt
うまくいくだろう。
解決
エコーを削除すると、動作するはずです:
for i in *.txt do awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done
テキストファイルにスペースが含まれていると失敗します。これを試すことができます:
find . -name '*.txt' -print0 | xargs --null -n 1 awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'
名前を出力するための代替手段:
find . -name '*.txt' -print -exec awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' {} \;
(基本的に、findにawkを直接実行させるため、ファイル名も出力します。
他のヒント
for i in *.txt; do echo "$i"; awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' "$i"; done
これにより、処理されたファイルの名前が awk
コマンドの出力とともに出力されます。
これを試してください( Solaris では nawk または / usr / xpg4 / bin / awk を使用):
awk 'END {
printf "%s: %.2f\n", fn, sum
}
FNR == 1 {
if (fn) printf "%s: %.2f\n", fn, sum
fn = FILENAME
sum = 0
}
$4 ~ /NM/ {
sum += $2
}' *.txt
「;」を追加する必要があります:
for i in *.txt; do ...
の代わりに
for i in *.txt do ...
echoは不要です。
試用
for i for * .txt;行う; awk '$ 4〜/ NM / {sum + = $ 2} END {print sum}' $ i;完了
または
for i for * .txt; do awk '$ 4〜/ NM / {sum + = $ 2} END {print sum}' $ i;完了
動作するはずです
コピペしたのかタイプミスなのかわかりません。
*.txt の場合は実行します エコー awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i;終わり
エコーを修正すると、上記のコマンドは awk スクリプトとファイル名をエコーしますが、実行はしません。
所属していません StackOverflow