Shell
將輸出重定向到同一文件的不同列
我有一系列 5 個命令處理位於多個子目錄中的多個文件。假設我想將每個命令的輸出重定向為同一文件中的新列,我該怎麼做。請幫助我。
例如。在下面的一系列命令中,我想將命令 1 的輸出重定向到 pop.txt 的第一列,將命令 2 的輸出重定向到 pop.txt 的第二列,將命令 3 的輸出重定向到 pop 的 3d 列。文本
命令 1 sed -n -e ‘1,33p’ myfile | awk ‘{ sum += $3 } END { print sum }’ >> ../pop.txt
命令 2 sed -n -e ‘34,40p’ myfile | awk ‘{ sum += $3 } END { print sum }’ >> ../pop.txt
命令 3 sed -n -e ‘41,49p’ myfile | awk ‘{ sum += $3 } END { print sum }’ >> ../pop.txt
如果我不清楚,請告訴我。
謝謝
如果你的 shell 支持程序替換,你可以使用
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 ./*/`
出於此處討論的原因Bash Pitfall #1