Awk
awk 語句的解釋
我使用這段程式碼在每 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 isa[19]
,最後a[20%20]
是 which isa[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)