[英]Printing nth rows after a row number in awk
1,A
2,B
3,C
4,D
5,E
6,F
7,G
8,H
9,I
10,J
11,K
12,L
13,M
14,N
如何使用 awk 先打印第 4 行,然后打印第 9 行,然后打印第 14 行? 我想先打印第 4 行,然后在第 4 行之后每隔 5 行繼續打印,直到文件結束。 我試過這個:
awk '{if(NR==4 || (NR>4 && NR==NR+7)) print $0}' file
但這不起作用。 任何幫助表示贊賞。
output 應該是:
4,D
9,I
14,N
假設您要從特定行號開始每隔 5 行打印一次:
$ seq 20 | awk 'NR==4{c=4} c && !((++c) % 5)'
4
9
14
19
$ seq 20 | awk 'NR==2{c=4} c && !((++c) % 5)'
2
7
12
17
$ seq 20 | awk 'NR==6{c=4} c && !((++c) % 5)'
6
11
16
c && !((++c) % 5)
說:
如果
c
已設置,則增加c
並測試該新值模5
是否為零。
因此,在NR==4
之前不能打印任何行,因為c
在此之前從未填充過,然后當c
設置為 4 時,它會遞增到5
並且5 % 5
為0
,因此會打印該行。 c
之后的每一行都會遞增,因此c % 5
不斷旋轉1 2 3 4 0
,因此當0
出現時每 5 行打印一次,所以!0
為真。
使用在命令行上設置的值而不是在腳本中硬編碼來執行上述操作將是:
$ seq 20 | awk -v b=4 -v n=5 'NR==b{c=n-1} c && !((++c) % n)'
4
9
14
19
簡單地
awk 'NR%5 == 4' file
將完成這項工作。 或者,如果您有 GNU sed
:
sed -n 4~5p file
你的代碼
awk '{if(NR==4 || (NR>4 && NR==NR+7)) print $0}' file
包含條件NR==NR+7
永遠不成立,反過來什么是正確的||
總是錯誤的,因此您的代碼實際上就像它一樣
awk '{if(NR==4) print $0}' file
使用 awk 先打印第 4 行,然后打印第 9 行,然后打印第 14 行?
只需提供 GNU AWK
;
- 描述你想要的線條的剪切條件是
awk 'NR==4;NR==9;NR==14' file
請記住,更改順序不會更改 output,因此您將獲得相同的 output
awk 'NR==14;NR==9;NR==4' file
(在 GNU Awk 5.0.1 中測試)
awk
中執行此操作,而無需使用modulo %
:jot 30 | mawk 'BEGIN { __+=_+=_+=__=_^=FS="^$" } _-(_+=__*(_==NR))'
4
9
14
19
24
29
沒有modulo %
通用解決方案:
-- "1st print
17th
row then once every
29
rows after that"
jot 200 | gawk '__-(__+=___*(NR == __))' FS='^$' __=17 ___=29
17
46
75
104
133
162
191
jot 14 | nawk '_*=--_'
1
3
5
7
9
11
13
這是另一個awk
解決方案
$ seq 30 | awk -v b=14 -v n=5 'NR>=b && !((NR-b)%n)'
14
19
24
29
這只是sed -n 14~5p
的翻譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.