【问题标题】:Unix awk deleting every two linesUnix awk 每两行删除一次
【发布时间】:2013-11-03 16:29:12
【问题描述】:

基本上我需要打印两行,然后删除两行,依此类推。

awk 'BEGIN {count = 0} if(count == 4){count = 0} else if(count <= 1) {print,count++} else {count++}' f4

我遇到语法错误。

awk '{count = 0; if(count == 4)count = 0; else if(count <= 1) print count++; else count++;}' f4

它打印全零。

我也试过

awk 'NR%3 && NR%4' f4

接近但不打印 3 和 4 的倍数。

谢谢

编辑:明白了!

awk 'BEGIN{count = 0};{ if(count == 3)count = 0; else if(count <= 1) {print; count=count+1;} else count=count+1;}' f4

【问题讨论】:

  • awk 'NR%3 &amp;&amp; NR%4' f4 这接近于一个可行的解决方案,请参阅我的帖子

标签: unix awk


【解决方案1】:

这应该是最简短最容易解释的一种

awk 'NR%4==1 || NR%4==2'


NR%4==1 将打印从 one 开始的每个 forth
NR%4==2 将打印从 two 开始的每个 forth
|| 这是一个逻辑 @ 987654329@

鉴于此文件

cat file
one 1
two 2
three 3
four 4
five 5
six 6
seven 7
eight 8
nine 9
ten 10
eleven 11
twelve 12
thirteen 13
fourteen 14
fifteen 15
sixteen 16
seventeen 17
eighteen 18
nineteen 19
twenty 20


awk 'NR%4==1 || NR%4==2' file

给予:

one 1
two 2
five 5
six 6
nine 9
ten 10
thirteen 13
fourteen 14
seventeen 17
eighteen 18

使用&amp;&amp; 的变体

awk 'NR%4 && NR%4!=3'

【讨论】:

  • 或者简而言之NR%4~/[12]/
【解决方案2】:

使用getline 函数读取以下行并丢弃您不想打印的行:

awk '{ print; getline; print; getline; getline }' infile

【讨论】:

  • @Nexus:那么你应该这样做,因为对于任何awk 编码器来说,它都是一个强大的命令。
【解决方案3】:

这对我有用:

awk 'int((NR-1)/2)%2 == 0'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 2015-07-11
    相关资源
    最近更新 更多