簡體   English   中英

AWK Mac OSX如何在同一行上打印數組鍵和數組值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM