AWK Mac OSX如何在同一行

时间:2016-12-20 23:14:27

标签: arrays linux macos awk

我意识到AWK程序在Mac OSX和Linux发行版上有所不同,但即使使用自制程序中的gawk,我也无法获得相同的结果。我希望能够理解我的AWK脚本需要调整哪些才能在我的Mac上工作,以便在同一行上打印数组键及其值。

这是我的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

我希望输出与Ubuntu上的GNU Awk 4.0.1一样:

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)无法在同一行上同时打印数组键和数组值?

1 个答案:

答案 0 :(得分:3)

由于您的文件具有DOS样式的CRLF行结尾,并且Mac上的awk仅将LF识别为行结尾,因此CR将作为附加字符包含在最后一个字段的末尾(在这种情况下为3美元)。

然后,当打印$ 3时,CR充当控制字符,在继续输出之前移动到行的开头,覆盖那里使得它看起来好像从未打印过。

因此,正如您所验证的那样,解决方案是在您的文件上运行 dos2unix 实用程序,使其与您的环境兼容。