我有一个文件,asdf2,有四条相同的行,但是没有从linux uniq命令获得一致的结果。文件中没有回车符,只有换行符。
该文件有四行:
$ cat asdf2 | wc -l
4
Uniq声称前两行完全相同:
$ cat asdf2 | uniq -c | wc -l
3
删除特殊字符会使所有行都相同:
$ cat asdf2 | sed 's/\xFE//g' | uniq -c | wc -l
1
此字符不在文件中:
$ cat asdf2 | sed 's/\x1C/@/g' | tr -dc '@'
用不同的字符替换会使所有行都相同:
$ cat asdf2 | sed 's/\xFE/\x1C/g' | uniq -c | wc -l
1
这样的事情怎么会发生?
具体来说,这是十六进制转储:
0000000: 506c 616e 6e65 6420 436f 7374 fe41 6374 Planned Cost.Act
0000010: 6976 6974 79fe 4163 7469 7669 7479 2047 ivity.Activity G
0000020: 726f 7570 fe41 6374 6976 6974 7920 4772 roup.Activity Gr
0000030: 6f75 7020 4944 fe41 6374 6976 6974 7920 oup ID.Activity
0000040: 4944 fe41 64fe 4164 2049 44fe 4164 2053 ID.Ad.Ad ID.Ad S
0000050: 7461 7475 73fe 4164 2054 7970 65fe 4164 tatus.Ad Type.Ad
0000060: 7665 7274 6973 6572 fe41 6476 6572 7469 vertiser.Adverti
0000070: 7365 7220 4772 6f75 70fe 4164 7665 7274 ser Group.Advert
0000080: 6973 0a50 6c61 6e6e 6564 2043 6f73 74fe is.Planned Cost.
0000090: 4163 7469 7669 7479 fe41 6374 6976 6974 Activity.Activit
00000a0: 7920 4772 6f75 70fe 4163 7469 7669 7479 y Group.Activity
00000b0: 2047 726f 7570 2049 44fe 4163 7469 7669 Group ID.Activi
00000c0: 7479 2049 44fe 4164 fe41 6420 4944 fe41 ty ID.Ad.Ad ID.A
00000d0: 6420 5374 6174 7573 fe41 6420 5479 7065 d Status.Ad Type
00000e0: fe41 6476 6572 7469 7365 72fe 4164 7665 .Advertiser.Adve
00000f0: 7274 6973 6572 2047 726f 7570 fe41 6476 rtiser Group.Adv
0000100: 6572 7469 730a 506c 616e 6e65 6420 436f ertis.Planned Co
0000110: 7374 fe41 6374 6976 6974 79fe 4163 7469 st.Activity.Acti
0000120: 7669 7479 2047 726f 7570 fe41 6374 6976 vity Group.Activ
0000130: 6974 7920 4772 6f75 7020 4944 fe41 6374 ity Group ID.Act
0000140: 6976 6974 7920 4944 fe41 64fe 4164 2049 ivity ID.Ad.Ad I
0000150: 44fe 4164 2053 7461 7475 73fe 4164 2054 D.Ad Status.Ad T
0000160: 7970 65fe 4164 7665 7274 6973 6572 fe41 ype.Advertiser.A
0000170: 6476 6572 7469 7365 7220 4772 6f75 70fe dvertiser Group.
0000180: 4164 7665 7274 6973 0a50 6c61 6e6e 6564 Advertis.Planned
0000190: 2043 6f73 74fe 4163 7469 7669 7479 fe41 Cost.Activity.A
00001a0: 6374 6976 6974 7920 4772 6f75 70fe 4163 ctivity Group.Ac
00001b0: 7469 7669 7479 2047 726f 7570 2049 44fe tivity Group ID.
00001c0: 4163 7469 7669 7479 2049 44fe 4164 fe41 Activity ID.Ad.A
00001d0: 6420 4944 fe41 6420 5374 6174 7573 fe41 d ID.Ad Status.A
00001e0: 6420 5479 7065 fe41 6476 6572 7469 7365 d Type.Advertise
00001f0: 72fe 4164 7665 7274 6973 6572 2047 726f r.Advertiser Gro
0000200: 7570 fe41 6476 6572 7469 730a up.Advertis.
事实上,将其直接粘贴到命令行似乎也可以正常工作:
$ echo 'Planned CostþActivityþActivity GroupþActivity Group IDþActivity IDþAdþAd IDþAd StatusþAd TypeþAdvertiserþAdvertiser GroupþAdvertis
Planned CostþActivityþActivity GroupþActivity Group IDþActivity IDþAdþAd IDþAd StatusþAd TypeþAdvertiserþAdvertiser GroupþAdvertis
Planned CostþActivityþActivity GroupþActivity Group IDþActivity IDþAdþAd IDþAd StatusþAd TypeþAdvertiserþAdvertiser GroupþAdvertis
Planned CostþActivityþActivity GroupþActivity Group IDþActivity IDþAdþAd IDþAd StatusþAd TypeþAdvertiserþAdvertiser GroupþAdvertis' | uniq -c | wc -l
答案 0 :(得分:1)
假设您使用的是GNU uniq
:
假设我的文件a
包含:
a a
a a
a a
a a
uniq a
a a
uniq -u a
# no output
运行uniq a
打印出前两行,因为没有任何选项uniq
将匹配行合并到其首次出现。但是,当您指定-u
时,uniq
仅会打印唯一的行。
阅读罚款manpage了解详情。
注意强>
uniq
不检测重复的行,除非它们相邻。
您可能希望先对输入进行排序,或使用sort -u
而不使用uniq
。