如何使用awk、sed或其他unix命令每隔n个时间间隔得到一个行的范围?

m3eecexj  于 2023-08-04  发布在  Unix
关注(0)|答案(4)|浏览(185)

我知道如何通过使用awk和sed得到一系列的线。我也知道如何使用awk和sed打印出每第n行。
但是,我不知道如何将两者结合起来。
例如,我有一个有178万行的文件。
对于每17800行,我想打印第17800行加上之后的两行。
所以如果我有一个1780000行的文件,它从1开始,到1780000结束,这将打印出来:

1
2
3
17800
17801
17802
35600
35601
35602
# ... and so on.

字符串
有谁知道如何使用awk、sed或其他unix命令每隔第n个间隔获取一个行的范围吗?

owfi6suc

owfi6suc1#

使用GNU sed:

sed -n '0~17800{N;N;p}' input

字符串
也就是说

For every 17800th line: 0~17800
  Read two lines: {N;N;
  And print these out: p}


我们还可以添加前三行:

sed -n -e '1,3p' -e '0~17800{N;N;p}' input


使用Awk,这会更简单:

awk 'NR%17800<3 || NR==3 {print}' input

7hiiyaii

7hiiyaii2#

$ cat file
1
2
3
4
5
6
7
8
9
10

$ awk '!(NR%3)' file
3
6
9

$ awk -v intvl=3 -v delta=2 '!(NR%intvl){print "-----"; c=delta} c&&c--' file
-----
3
4
-----
6
7
-----
9
10

$ awk -v intvl=4 -v delta=2 '!(NR%intvl){print "-----"; c=delta} c&&c--' file
-----
4
5
-----
8
9

$ awk -v intvl=4 -v delta=3 '!(NR%intvl){print "-----"; c=delta} c&&c--' file
-----
4
5
6
-----
8
9
10

字符串

eoigrqb6

eoigrqb63#

seq -f %.0f 1780000 | awk 'NR < 4 || NR % 17800 < 3' | head

字符串
产出:

1
2
3
17800
17801
17802
35600
35601
35602
53400

说明

  1. NR < 4用于前3行,因为需求For every 17800th line, print 17800th line plus the two after that.不适合您给出的输出。
    1.这里我使用head来减小输出大小,您应该在用例中删除它。
    1.对于GNU seq,你不需要-f %.0f
cnh2zyt3

cnh2zyt34#

awk解决方案,跳过 *ALL * 除法/模/逐行计数器操作,并且每N行仅更新一次跟踪器的值:

jot 80000 |
mawk 'NR == (_? _ : (__ = ___ + !+_)^(_ = "+" (+_))),
      NR == __  &&   __ = ___ + (_ += ____)' ___=2 ____=17800
1
2
3
17800
17801
17802
35600
35601
35602
53400
53401
53402
71200
71201
71202

相关问题