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)它不应该卡住,应该用第一个重复记录开始打印。对于脚本开始打印,文件大小应该无关紧要。也许你在做别的事?