同じファイルの別の列への出力リダイレクト

同じファイルの別の列への出力リダイレクト

複数のsuディレクトリにある複数のファイルを処理する一連の5つのコマンドがあります。各コマンドの出力を同じファイルの新しい列にリダイレクトしたいとします。どうすればいいですか?助けてください。

例えば。次の一連のコマンドでは、コマンド1の出力をpop.txtの最初の列にリダイレクトし、コマンド2の出力をpop.txtの2番目の列に、コマンド3の出力をpopの3d列にリダイレクトしたいと思います。 .txt. txt

コマンド1 sed -n -e '1,33p'私のファイル| awk '{ sum += $3 } END { print sum }' >> ../pop.txt

コマンド2 sed -n -e '34,40p'私のファイル| awk '{ sum += $3 } END { print sum }' >> ../pop.txt

コマンド3 sed -n -e '41,49p'私のファイル| awk '{ sum += $3 } END { print sum }' >> ../pop.txt

わからない場合は教えてください。

ありがとう

答え1

シェルがプロセス置換をサポートしている場合は、paste次のコマンドを使用できます。

paste \
  <(sed -n -e '1,33p' myfile | awk '{ sum += $3 } END { print sum }') \
  <(sed -n -e '34,40p' myfile | awk '{ sum += $3 } END { print sum }') \
  <(sed -n -e '41,49p' myfile | awk '{ sum += $3 } END { print sum }') >> ../pop.txt

しかし、このように同じファイルを複数回処理することは非効率的です。単一の awk コマンドを使用できます。

awk '{sum+=$3} NR==33{s1=sum; sum=0} NR==40{s2=sum; sum=0} NR==49{print s1,s2,sum; exit}' >> ../pop.txt

(コメントの後続の質問に回答) PWD を最初の列として追加するには:

awk -v cwd="$(basename "$PWD")" '
  {sum+=$3} NR==33{s1=sum; sum=0} NR==40{s2=sum; sum=0} NR==49{print cwd,s1,s2,sum; exit}
'

ところで、このような構造は避けてください

for f in `ls -d ./*/`

ここで議論された理由からバッシュトラップ #1

関連情報