Bash:如何将多个命令应用于同一文件并连接输出

3
假设我想在一个以制表符分隔的文件中按列聚合值并保留标题。
我可以这样做:
  (head -n 1 <infile> && tail -n +2 | awk '{s+=$1} END {print s}' <infile>) > <outfile>

但是假设我希望输入来自一个管道(例如,我正在对特定列执行操作),该怎么办呢?

我该如何做到这一点?

下面的一行代码是否有效?

  (head -n 1 && tail -n +2 | awk '{s+=$1} END {print s}') <infile>  > <outfile>

如果我想仅对第k列进行求和,以下代码是否可行?
  cut -f<k> <infile> | (head -n 1 && tail -n +2 | awk '{s+=$1} END {print s}')  > <outfile>

这些语句如何被bash解释?

2
你的第一次尝试在管道上几乎可以工作(一旦删除<infile>,因为它只是一个错误)。话虽如此,你不想在这里烦扰涉及到headtail,直接使用awk完成所有操作(使用NR根据当前行号执行不同的操作等)。 - Etan Reisner
发布一些示例输入和预期输出。 - Ed Morton
1个回答

3

使用 awk 完成所有操作,通过测试 NR 来实现。

somecommand | awk 'NR == 1 { print; next } { s += $1 } END { print s }' > outfile

这行代码用于正常打印第一行,因为有NR == 1的判断条件,并对剩余行中的第一列求和。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接