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