gpt4 book ai didi

arrays - AWK Mac OSX 如何在同一行打印数组键和数组值

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:57 25 4
gpt4 key购买 nike

我意识到 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

我希望输出像在使用 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

无论出于何种原因,当它与另一个变量 dupes[key] 一起打印时,它不会打印我的 for 循环的 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 实用程序,使其与您的环境兼容。

关于arrays - AWK Mac OSX 如何在同一行打印数组键和数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41252702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com