这是我在解析 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
第一输入线是第一输出线。其余行已排序。