将输出重定向到同一文件的不同列

将输出重定向到同一文件的不同列

我有一系列 5 个命令处理位于多个 su 目录中的多个文件。假设我想将每个命令的输出重定向为同一文件中的新列,我该怎么做。请帮助我。

例如。在下面的一系列命令中,我想将命令 1 的输出重定向到 pop.txt 的第一列,将命令 2 的输出重定向到 pop.txt 的第二列,将命令 3 的输出重定向到 pop.txt 的 3d 列。TXT

命令1 sed -n -e '1,33p' 我的文件 | awk '{ sum += $3 } END { 打印 sum }' >> ../pop.txt

命令2 sed -n -e '34,40p' 我的文件 | awk '{ sum += $3 } END { 打印 sum }' >> ../pop.txt

命令3 sed -n -e '41,49p' 我的文件 | awk '{ sum += $3 } END { 打印 sum }' >> ../pop.txt

如果我不清楚,请告诉我。

谢谢

答案1

如果您的 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 陷阱#1

相关内容