所以我有一个制表符分隔的输入文件,该文件在某一列中有空格,例如:
输入文件:
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