我意识到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)无法在同一行上同时打印数组键和数组值?
答案 0 :(得分:3)
由于您的文件具有DOS样式的CRLF行结尾,并且Mac上的awk仅将LF识别为行结尾,因此CR将作为附加字符包含在最后一个字段的末尾(在这种情况下为3美元)。
然后,当打印$ 3时,CR充当控制字符,在继续输出之前移动到行的开头,覆盖那里使得它看起来好像从未打印过。
因此,正如您所验证的那样,解决方案是在您的文件上运行 dos2unix 实用程序,使其与您的环境兼容。