[英]AWK Mac OSX how to print array key and array value on same line
我意識到AWK程序在Mac OSX和Linux發行版上有所不同,但是即使使用自制軟件中的gawk
,我也無法獲得相同的結果。 我希望了解在Mac上運行AWK腳本需要進行哪些調整,以便在同一行上同時打印陣列鍵及其值。
這是我的awk文件:
BEGIN { FS="," }
NR > 1 {
dupes[$3]++;
}
END {
OFS=" ";
for (key in dupes) {
if (dupes[key] > 1) {
print key, "occured", dupes[key], "times";
}
}
}
這是一個test.csv文件
test,something,target_column3
aaa,123,hi
sss,222,hello
ddd,333,hey
fff,444,hi
ggg,555,hi
jjj,888,goodbye
uuu,666,byebye
lll,777,hey
我希望輸出像在具有GNU Awk 4.0.1的Ubuntu上一樣顯示:
hey occured 2 times
hi occured 3 times
但是在我的Mac上,它以gawk
版本GNU Awk 4.1.4,API:1.1(GNU MPFR 3.1.5,GNU MP 6.1.2)輸出:
occured 2 times
occured 3 times
無論出於何種原因,它不打印key
我的for循環時,旁邊另一個變量, dupes[key]
。 但是,當它是唯一的東西時,它將print key
。
更新:根據@jas注釋,我檢查了行尾,無論出於何種原因,我的csv文件都具有CRLF
。 另外,添加如下所示的打印值會顯示一些奇怪的輸出。 我希望所有長度都少一個字符,而我得到:
...
NR > 1 {
print length($3);
dupes[$3]++;
}
...
3
6
4
3
3
8
7
4
occured 2 times
occured 3 times
Mac OSX AWK(或GAWK)為什么不能在同一行上同時打印陣列鍵和陣列值的任何原因?
因為您的文件具有DOS樣式的CRLF行尾,並且在Mac上awk僅將LF識別為行尾,所以CR作為附加字符包含在最后一個字段的末尾(本例中為$ 3)。
然后,當打印$ 3時,CR充當控制字符,在繼續輸出之前移至行的開頭,覆蓋那里的內容,使其看起來好像從未打印過。
因此,您已驗證的解決方案是僅在文件上運行dos2unix實用程序,使其與您的環境兼容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.