删除以1开头的所有其他行

时间:2014-05-21 19:04:17

标签: awk sed text-files delete-row

我可以找到sed解决方案来删除文本文件中以“1”开头的所有行以及删除文本文件中所有行的所有其他行的解决方案但是我想将两者结合起来...以'1'开头的行会删除其中每一行,并保留其他不以1开头的行。

所以,如果我有一个文本文件:

1, 1
1, 2
2, 3
3, 4
4, 5
2, 6
1, 7
3, 8
1, 9
4, 10

我希望输出为:

1, 1
2, 3
3, 4
4, 5
2, 6
1, 7
3, 8
4, 10

3 个答案:

答案 0 :(得分:2)

你可以在awk中执行此操作:

awk -F, '!($1 == 1 && n++ % 2)' file

-F,表示使用逗号作为字段分隔符,因此每行上的两个数字将是变量$1$2

如果它评估的最后一件事是真的,那么

awk会打印该行。 !否定了括号的内容,因此为了打印,内容必须为false。

如果第一个字段不是1,则会发生短路,因为(false && anything)始终为false。这意味着&&之后的后半部分将不会被评估。

如果$1 == 1,则评估后半部分。由于n首次在数字上下文中使用,因此它将采用值0。对于偶数,模运算n % 2将返回0(false),对于奇数,将返回1(true)。使用增量n++意味着结果将在true和false之间交替。

您可能更喜欢反向逻辑,即:

awk -F, '$1 != 1 || ++n % 2' file

||也是短路的,因此如果第一个值不是1,则会打印该行。否则,评估后半部分。这一次,增量在n之前,因此n的第一个值为1,使表达式的值为true。

无论哪种方式,输出都是:

1, 1
2, 3
3, 4
4, 5
2, 6
1, 7
3, 8
4, 10

答案 1 :(得分:0)

你走了:

awk '$1=="1," && !(f=f?0:1) {next} 1' file
1, 1
2, 3
3, 4
4, 5
2, 6
1, 7
3, 8
4, 10

$1=="1,"测试第一个字段是1
f=f?0:1每次f0时,1$1=="1,"之间的!(...)翻转 f如果0为{{1}}

,则为真

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed '/^1/{x;/./{z;x;d};x;h}' file

使用保留空格切换以1开头的行的删除。