按标题名称打印 awk 中的列

use*_*864 20 awk text-processing

我有一个像这样的文本文件

foo bar baz
1   a   alpha
2   b   beta
3   c   gamma
Run Code Online (Sandbox Code Playgroud)

我可以使用 awk 打印某些列,例如 1 和 3,{print $1, $3}但我想通过指定列的标题来指定要打印的列,例如{print $foo, $baz}. 这很有用,因此我不必打开文件并手动计算列数以查看哪一列是哪一列,而且如果列号或顺序发生变化,我也不必更新脚本。我可以用 awk(或其他 shell 工具)做到这一点吗?

Ed *_*ton 31

awk '
NR==1 {
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
}
{ print $(f["foo"]), $(f["baz"]) }
' file
foo baz
1 alpha
2 beta
3 gamma
Run Code Online (Sandbox Code Playgroud)

这是一个非常有用的习语。我在电子表格中有很多数据,不同的电子表格可能有一个我感兴趣的公共列子集,但不一定在所有电子表格中的顺序相同,或者在它们之前/之间具有相同数量的其他列,因此能够导出它们作为 CSV 或类似的文件,然后简单地使用列名而不是列号运行 awk 脚本绝对是无价的。

  • 不客气。这绝对是基本的 awk 语法,只需在 awk 手册页(或谷歌搜索)中查找字段和数组即可。在循环中添加 `print i` 和 `print $i` 以及 `print `f[$i]` 语句等来跟踪发生的情况(如果有帮助的话)。 (2认同)

pLu*_*umo 5

您要求awk,但您也可以使用更专业的工具来实现此目的:csvtool

csvtool -t ' ' -u ' ' namedcol foo,baz file
Run Code Online (Sandbox Code Playgroud)

或者

csvtool -t ' ' -u ' ' col 1,3 file
Run Code Online (Sandbox Code Playgroud)