複数の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