是否可以透過 cli 從 csv 列印參數的迭代範圍? (請參閱範例)

是否可以透過 cli 從 csv 列印參數的迭代範圍? (請參閱範例)

我有數百條日誌分佈在幾千個虛擬機器上,我正在嘗試創建一些腳本來快速掃描日誌,我已經弄清楚了演示文稿的大部分內容,並想知道是否有一種簡單的方法使用awk 之類的東西,我知道如何使用 printf 等,但專門用於列印日誌檔案中的迭代值範圍?

例子:

awk -F, '{printf $(1..5)}' huge_log_file.csv
column1 column2 column3 column4 column5
etc.

我知道如何正確地 awk、格式化、分離等列印輸出,但我認為如果我可以指定我希望列印的一系列字段,那就太好了。

如果我弄清楚如何使用建議的類似問題和/或自行解決問題,我將更新我的問題。

謝謝!

編輯:我知道如何手動列印 $1 $2 $3 但沒有將其包含在我的範例中

編輯2:我還知道如何使用 NF 來計算 awk 的字段數量,以便稍後使範圍動態化,這是我的長期目標。

答案1

以第一個字段開始的範圍

讓我們考慮這個測試文件:

$ cat input.csv
a,b,c,d,e,f,g,h,i,j

至少使用 GNU awk,我們可以列印前五個(或其他數量)的字段,如下所示:

$ awk -F, '{NF=5; print}' OFS=, input.csv
a,b,c,d,e

對於那些重視簡潔而不是清晰的人,我們可以等效地寫:

$ awk -F, '{NF=5;} 1' OFS=, input.csv
a,b,c,d,e

動態調整大小

要忽略最後 2 個字段,無論這兩個字段之前有多少個字段:

$ awk -F, '{NF-=2; print}' OFS=, input.csv
a,b,c,d,e,f,g,h

其他範圍

要列印任意欄位的開始和停止,則需要一個循環:

$ awk -v first=3 -v last=6 -F, '{for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f

若要從第三個欄位列印並動態保留最後兩個欄位:

$ awk -v first=3 -F, '{last=NF-2; for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f,g,h

答案2

只是簡單說一下;awk更加靈活,但如果您想要的只是特定範圍的字段,請使用cut

cut -d, -f1-5 huge_log_file.csv

awk如果這就是您所需要的,那麼這比循環簡單得多。

相關內容