打印逆序时,awk会覆盖字母,为什么?

时间:2015-01-27 05:51:26

标签: bash awk

我目前正在使用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这样的输出。有什么问题?

1 个答案:

答案 0 :(得分:4)

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

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文件,我相信即使cut也可以从上述命令中移除head

PS:感谢@Bammar你也可以运行:

dos2unix file.csv

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