質問

拡張子が「*.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 スクリプトとファイル名をエコーし​​ますが、実行はしません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top