【发布时间】:2017-05-06 06:46:28
【问题描述】:
我意识到 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
无论出于何种原因,当与另一个变量 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)不能在同一行打印数组键和数组值?
【问题讨论】:
-
无法重现。你的终端可能有问题?尝试将输出重定向到文件并使用文本编辑器查看它。
-
“无法复制”是指在 /usr/bin/awk 和 gawk 4.1.4 (macports) 上按预期工作
-
当您的文件中有错误的行尾时,可能会发生这种情况。就像一个控制字符卡在 $3 的末尾,它在继续写入字符之前将光标移动到行首。
-
尝试打印
length($3)。是你所期望的吗? -
我认为你只需要在你的文件上运行一个 dos2unix 实用程序。