除了第一行之外,对 awk 的输出进行排序?

除了第一行之外,对 awk 的输出进行排序?

这是我在解析 CSV 文件时不断遇到的一个用例。当它是awk嵌入在 shell 脚本中的内联脚本时,我可以使用此解决方法:

myfile="$(mktemp)"
awk '(awk script here)' > "$myfile"
head -1 "$myfile"
sed 1d "$myfile" | sort
rm "$myfile"

(或者对 BSD mktemp 使用适当的 mktemp 模板;GNU 的工作方式如上所述。)

然而,当使用 shebang 编写完整的 awk 脚本时#!/bin/awk -f,我不想将其更改为 shell 脚本只是为了处理对输出进行排序的这一因素。

我怎样才能在 awk 中做到这一点?或者,如果 awk 中没有本机排序函数,我在哪里可以了解 awk 管道以及如何使用管道在不更改 shebang 的情况下完成此任务?

答案1

下面是一个对除第一行之外的所有行进行排序的示例:

#!/bin/awk -f
BEGIN{cmd="sort"}
NR==1{print;next}
{print $1,$2 | cmd}
END{close(cmd)}

例子

考虑这个文件:

$ cat file
Letter  Value
A       12
D       10
C       15
B       13

然后:

$ awk -f script.awk file
Letter  Value
A 12
B 13
C 15
D 10

第一输入线是第一输出线。其余行已排序。

相关内容