Awk

awk 語句的解釋

  • June 4, 2020

我使用這段程式碼在每 20 行之後開始一個新列,並且每一列都由製表符分隔。我從這篇文章中獲取了程式碼,然後對其進行了一些調整:如何在每第 n 行之後開始一個新列?

awk '{a[NR%20] = a[NR%20] (NR<=20 ? "" : "\t") $0} END {for (i = 1; i <= 20; i++) print a[i%20]}' 

它完全符合我的要求。但是,我真的不明白它是如何工作的。有人可以向我解釋一下嗎?我知道這$0將讀入文件的整個記錄(行),並且評估問號之前的條件,如果為真,則執行第一條語句,如果為假,則執行第二條。所以在這種情況下,如果NR<=20沒有列印任何內容,因為我們在第一列,但是如果NR>20然後列印一個選項卡以開始一個新列。我也知道 for 循環列印出數組的元素,從a[1%20]which isa[1]等開始,到a[19%20]which is a[19],最後a[20%20]是 which is a[0]。但是有什麼作用a[NR%20] = a[NR%20]呢?為什麼它設置為等於自身?當我省略時,我看到了a[NR%20] = a[NR%20], 列印出 20 個空白行。

awk中,由空格分隔的表達式連接在一起。這種連接在 POSIX awk 手冊中的表達式表中進行了描述(該頁面上的格式不是很清楚,通過 閱讀更容易man 1p awk)。a[NR%20]正在與其目前值 + ""/ "\t"+ 目前記錄一起加入。對於前 20 條記錄,數組值和三元?:表達式都是空字元串。括號可能會更清楚:

a[NR%n] = (a[NR%n] (NR<=n ? "" : "\t") $0)

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