簡體   English   中英

在 awk 中的行號之后打印第 n 行

[英]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 % 50 ,因此會打印該行。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM