如何通过awk排除列中与正则表达式模式匹配的行?

如何通过awk排除列中与正则表达式模式匹配的行?,awk,Awk,我想排除包含特定字符串的行 header 1:test 2:test 3:none 4:test 为什么这些命令不起作用 awk -F: 'FNR>1 {$0 !~ /none/} {print $1}' 1.txt awk -F: 'FNR>1 {$2 !~ /none/} {print $1}' 1.txt 但这是可行的: awk '$0 !~ /none/ {print $0}' 1.txt 我打算 1 2 4 您需要将regex测试作为条件提供,而不是作为操作提供,并

我想排除包含特定字符串的行

header
1:test
2:test
3:none
4:test
为什么这些命令不起作用

awk -F: 'FNR>1 {$0 !~ /none/} {print $1}' 1.txt
awk -F: 'FNR>1 {$2 !~ /none/} {print $1}' 1.txt
但这是可行的:

awk '$0 !~ /none/ {print $0}' 1.txt
我打算

1
2
4

您需要将regex测试作为条件提供,而不是作为操作提供,并且可以使用

awk -F: 'FNR>1 && !/none/{print $1}' file
awk -F: 'FNR>1 && $2 !~ /none/{print $1}' file

详细信息

  • -F:
    -将字段分隔符设置为冒号
  • FNR>1&&/none/
    -如果当前文件的已处理记录数大于1,且行上没有
    none
    (如果使用
    $2!~/none/
    ,如果字段2不包含
    none
    模式,则返回true)
  • {print$1}
    -打印字段1值

使用
awk-F:'NR>1&&/无/{print$1}'文件
awk-F:'NR>1&&2!~/无/{print$1}文件
@WiktorStribiżew运行良好!更接近您试图做的事情(但不比您选择的正确答案好):首先,列出了两个独立的操作。不管第一个做什么,第二个都会被执行。你的第一个“行动”根本不是一个行动。你想做的是一个
if
语句,但你没有把它写成
if
语句。你可以这样做;但通常的方法是Wiktor告诉你的。