我有一系列 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