【问题标题】:Awk is overwriting letters when printing reversed order, why?awk 在打印逆序时会覆盖字母,为什么?
【发布时间】:2015-01-27 13:54:03
【问题描述】:

我目前正在使用 awk 来复制函数 uniq -c,并以逗号作为分隔符。

这给出了正确的输出:

$ cut --delimiter=, -s -f2 wordlist.csv | awk '{ cnts[$0] += 1 } END { for (v in cnts) print cnts[v], v}' OFS="," | head

2,laecherlichen
111,doctrine
1,cremonas
1,embedding
1,conincks
2,similiter
1,mitgesellen
1,hysnelement
1,geringem
1,aquarian

但是,如果我将 awk 命令 print cnts[v], v 反转为 print v, cnts[v],我会得到一个混乱的输出:

$ cut --delimiter=, -s -f2 wordlist.csv | awk '{ cnts[$0] += 1 } END { for (v in cnts) print v, cnts[v]}' OFS="," | head

,2echerlichen
,111rine
,1emonas
,1bedding
,1nincks
,2militer
,1tgesellen
,1snelement
,1ringem
,1uarian

我对这个输出感到困惑,因为我期待像 word,1 这样的输出。有什么问题?

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    您很可能在行尾 \n 之前有 DOS 换行符,即 \r。您可以使用awk 中的RS 变量来忽略它:

    cut --delimiter=, -s -f2 wordlist.csv | awk -v RS='\r|\n' '{
        cnts[$0] += 1 } END { for (v in cnts) print cnts[v], v}' OFS="," | head
    

    但是,如果您显示您的 csv 文件,我相信即使 cuthead 也可以从上述命令中删除。

    PS:感谢@Bammar,您也可以运行:

    dos2unix file.csv
    

    将您的 csv 文件转换为 unix 兼容文件。

    【讨论】:

    • 谢谢@Barmar:我一直忘记dos2unix,因为我的OSX上没有它。
    猜你喜欢
    • 2017-02-15
    • 1970-01-01
    • 2018-08-24
    • 2021-08-07
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多