如何在 awk 命令中按名称引用列?

如何在 awk 命令中按名称引用列?

所以我有一个制表符分隔的输入文件,该文件在某一列中有空格,例如:

输入文件:

A    B    C    D
1    12   34   545
34        12   56
23   10   15   67
31        99   100

现在,我的目标是将所有带有空白的行添加到我的输出文件中,例如:

输出文件:

34       12    56
31       99    100

所以我使用这个命令来实现我的结果 -

awk -F $'\t' '$2 == ""' input_file >> output_file

如果“B”列始终位于位置 2,则此方法非常有效,但如果它位于其他位置,则此方法将不起作用。如何通过其地址来寻址“B”列姓名awk命令中?

答案1

AFAIK 在 awk 中没有办法做到这一点,除非迭代标题的字段并记录匹配列的索引:

awk -F '\t' 'NR==1{for(i=1;i<=NF;i++) if($i=="B") bi=i} $bi == ""' file.tsv

如果您有权访问 Miller,您可以直接按名称过滤。

mlr --tsv filter '$B == ""' file.tsv

或使用 Python CSVKit 中的实用程序:

csvgrep -t -c B -r "." -i file.tsv | csvformat -T

答案2

您可以处理第一行以将标题名称映射到列号:

awk -F'\t' '
  NR == 1 {for (i=1; i<=NF; i++) column[$i] = i}
  $(column["B"]) == ""
' input_file

答案3

awk 命令的另一种变体:

awk '!Bi{ FS="B"; $0=$0; Bi=1+gsub(/\t/,//,$1); FS="\t"; next} $Bi==""' infile

相关内容