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

标签 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

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

相关文章:

arrays - Lisp 变量未绑定(bind)

php - 将 foreach() 与多维数组一起使用

javascript - 分割数组 - JS

javascript - JSON 字符串中的对象名称中有空格并且仍然可以检索它吗?

linux - 给定行分隔的文本 block ,如何返回包含特定关键字的每个 block ?

c++ - 如何中止对 sigwaitinfo 的调用?

Mac OS X 上更新后未导入 Python 包

java - 拆分两个文件

node.js - 通过 sox 从多个 channel 录制

ios - 如何使用 bundle 中的数据移动 sqlite3 数据库