Text-Processing

管道跳過每 100 行中的 99 行

  • May 29, 2021

我有一個 bash 命令管道,可以產生大量的日誌文本輸出。但除了時間戳和一些次要標誌外,它主要重複上一行,主要輸出數據在幾個小時內僅更改一次。我需要將此輸出儲存為文本文件以供將來處理/研究。為了只列印每個 X 中的第一行,我應該將它傳輸到什麼位置?

列印第一行並在每 N 行中跳過接下來的 N-1 行。

awk -v N=100 'NR%N==1' infile

測試:

$ seq 1000 |awk -v N=100 'NR%N==1'
1
101
201
301
401
....

要傳遞要跳過的行數,我們也可以從參數中讀取,所以:

$ seq 1000 |awk -v Num=100 -v Skip=98 '(NR-1)%Num<Num-Skip'
1
2
101
102
201
202
301
302
401
402
501
502
601
602
701
702
801
802
901
902

@αғsнιη 已經向您展示瞭如何執行您要求的操作(跳過特定數量的行),但聽起來您最好不要列印僅在“時間戳和一些次要標誌”方面不同的後續行,而不是弄清楚一個要跳過的特定行數。如果是這樣,如果這些“時間戳和一些次要標誌”儲存在欄位 3、6、8 和 17 中,您會這樣做:

awk '
{
   origRec = $0
   $3=$6=$8=$17=""
   currKey = $0
}
currKey != prevKey {
   print origRec
   prevKey = currKey
}
' file

您可以輕鬆地調整上面的內容,不僅列印每個相似組的第一行,還列印最後一行,以便您可以查看第一個和最後一個時間戳(如果有用),和/或您可以添加列印方式許多類似的行被跳過。

引用自:https://unix.stackexchange.com/questions/650878