2015-08-19 3 views
1

Как найти дубликаты в столбце?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 
    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 
+0

Что относительно 'awk -F, 'NR> 1 {print $ 5}' countries_lat_long_int_code3.csv | сортировать | uniq -c | grep -v '^ * 1 *' '? Taht сгруппирует все повторяющиеся строки с помощью uniq -c и удалит все те, которые появляются один раз. –

+0

Каков ваш желаемый результат. Количество дубликатов кодов, дубликатов записей, уникальных кодов? – karakfa

+1

Вы только заботитесь о 5-м поле или о других? – HuStmpHrrr

ответ

3

Это даст вам дублированный Коды

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}' 
+2

Ваш последний работает нормально, когда есть только один повтор. Однако, если есть еще одна строка с '$ 5 == 1', то она печатает линию Ангильи второй раз. Вы можете обойти это достаточно легко. Я использовал немного подробный: 'awk -F, '{if (count [$ 5]> 1) print $ 0; else if (count [$ 5] == 1) {print save [$ 5]; print $ 0; } else save [$ 5] = $ 0; рассчитывать [$ 5] ++; } ' '. Массив подсчета фиксирует, сколько раз $ 5 было замечено раньше. Если это не один раз, просто распечатайте новую запись; если это только один раз, распечатайте сохраненную (первую) запись и новую запись; в противном случае это будет новым, поэтому сохраните $ 0. Увеличьте счет так или иначе. –

2

Это меньше памятей агрессивно я догадываюсь:

$ 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 

ПРИМЕЧАНИЯ: Я включил еще одну копию для целей тестирования.

Смежные вопросы