awk+;如何在列中找到重复项?
如何在列中找到重复项awk+;如何在列中找到重复项?,awk,Awk,如何在列中找到重复项 $ head countries_lat_long_int_code3.csv | cat -n 1 country,latitude,longitude,name,code 2 AD,42.546245,1.601554,Andorra,376 3 AE,23.424076,53.847818,United Arab Emirates,971 4 AF,33.93911,67.709953,Afghanistan,93
$ head countries_lat_long_int_code3.csv | cat -n
1 country,latitude,longitude,name,code
2 AD,42.546245,1.601554,Andorra,376
3 AE,23.424076,53.847818,United Arab Emirates,971
4 AF,33.93911,67.709953,Afghanistan,93
5 AG,17.060816,-61.796428,Antigua and Barbuda,1
6 AI,18.220554,-63.068615,Anguilla,1
7 AL,41.153332,20.168331,Albania,355
8 AM,40.069099,45.038189,Armenia,374
9 AN,12.226079,-69.060087,Netherlands Antilles,599
10 AO,-11.202692,17.873887,Angola,244
例如,第5列中有重复项
5 AG,17.060816,-61.796428,Antigua and Barbuda,1
6 AI,18.220554,-63.068615,Anguilla,1
如何查看此文件中的所有其他文件
我知道我能做到:
awk -F, 'NR>1{print $5}' countries_lat_long_int_code3.csv | sort
我可以看看是否有重复的,但有更好的方法吗
或者我可以这样做:
弄清楚你是怎么做到的
$ awk -F, 'NR>1{print $5}' countries_lat_long_int_code3.csv | sort | wc -l
210
找出有多少唯一值
$ awk -F, 'NR>1{print $5}' countries_lat_long_int_code3.csv | sort | uniq | wc -l
183
因此,最多有27(210-183)个副本
EDIT1
我想要的输出如下,基本上是所有列,但只是显示重复的行:
5 AG,17.060816,-61.796428,Antigua and Barbuda,1
6 AI,18.220554,-63.068615,Anguilla,1
这将为您提供重复的代码
awk -F, 'a[$5]++{print $5}'
如果你只对重复代码的计数感兴趣
awk -F, 'a[$5]++{count++} END{print count}'
要打印重复的行,请尝试以下操作
awk -F, '$5 in a{print a[$5]; print} {a[$5]=$0}'
这将使用列$5中的重复项打印整行:
awk -F, 'a[$5]++{print $0}'
这是我能猜到的内存攻击性较小的原因:
$ cat infile
country,latitude,longitude,name,code
AD,42.546245,1.601554,Andorra,376
AE,23.424076,53.847818,United Arab Emirates,971
AF,33.93911,67.709953,Afghanistan,93
AG,17.060816,-61.796428,Antigua and Barbuda,1
AI,18.220554,-63.068615,Anguilla,1
AL,41.153332,20.168331,Albania,355
AM,40.069099,45.038189,Armenia,374
AN,12.226079,-69.060087,Netherlands Antilles,599
AO,-11.202692,17.873887,Angola,355
$ awk -F\, '$NF in a{if (a[$NF]!=0){print a[$NF];a[$NF]=0}print;next}{a[$NF]=$0}' infile
AG,17.060816,-61.796428,Antigua and Barbuda,1
AI,18.220554,-63.068615,Anguilla,1
AL,41.153332,20.168331,Albania,355
AO,-11.202692,17.873887,Angola,355
注意:为了测试的目的,我添加了另一个副本。如果您只想打印出一个在同一文件上重复的唯一值,只需在awk的末尾添加: 哎呀排序| uniq-u
这将只按字母顺序打印唯一值那么
awk-F,'NR>1{print$5}国家/地区_lat_long_int_code3.csv | sort | uniq-c | grep-v ^*1*呢
?Taht将使用uniq-c对所有重复的行进行分组,并删除所有一次出现的行。您希望的输出是什么。重复代码、重复记录、唯一代码的计数?您是否只关心第5个字段或任何其他字段?只有一次重复时,您的最后一个字段工作正常。但是,如果有另一行的$5==1
,那么它会再次打印安圭拉行。你可以很容易地解决这个问题。我使用了一个稍微冗长的:awk-F,'{if(count[$5]>1)打印$0;else if(count[$5]==1){print save[$5];print$0;}else save[$5]=$0;count[$5]+;}'
。count数组记录以前看到$5的次数。如果不止一次,只需打印新记录;如果只有一次,打印保存的(第一条)记录和新记录;否则,这是新的,所以节省$0。无论如何都要增加计数。a
在a[$5]
中代表什么?它是将$5
作为键保存的数组的名称,该值每次都会增加,因此总体而言,它的行为类似于此上下文中的python计数器
对象。当我尝试运行它时,它只是卡住了(我的文件包含400万行~500 Mb)它不应该卡住,应该用第一个重复记录开始打印。对于脚本开始打印,文件大小应该无关紧要。也许你在做别的事?