2014-10-08 4 views
1

Я хочу увидеть, какая строка в моей колонке 2 повторяется.Проверьте, какая строка в определенном столбце повторяется

Например:

a apple 
b peach 
c grape 
d peach 
e peach 
f apple 

Мой результат будет:

a apple 
f apple 
b peach 
d peach 
e peach 

Показана вся строка, которая имеет общую строку на второй колонке.

ответ

3

Если вы не хотите хранить весь файл в памяти, лучше всего дважды прочитать файл.

$ awk 'FNR==NR {a[$2]++; next} a[$2]>1' file file 
a apple 
b peach 
d peach 
e peach 
f apple 
  • , во-первых, чтобы подсчитать, сколько раз появляется значение столбца
  • , во-вторых, чтобы напечатать строки, в которых второй столбец подсчитывали по крайней мере дважды.

Как Jonathan Leffler suggests, чтобы воспроизвести точный вывод, который вы получаете, только трубы к sort показывая, что он должен сортировать в первую очередь на колонке 2, а затем на колонке 1:

awk 'FNR==NR {a[$2]++; next} a[$2]>1' file file | sort -k2,2 -k1 
+1

+1 хотя quibblers среди нас можно отметить, что оригинальный выход имеет все яблоки, перечисленные рядом друг с другом на выходе, и перед всеми персиками. Это, вероятно, было бы наиболее легко устранено путем сортировки вывода из вашего скрипта во втором столбце: '| sort -k2' или, возможно, '| sort -k2,2 -k1'. Это также можно сделать в 'awk', проще, если файлы достаточно малы, чтобы вместить их в память, и гораздо менее легко, если они не являются. –

+0

@JonathanLeffler довольно верно. Я просто обновил вашу рекомендацию 'sort'. Я предпочитаю использовать трубопровод для инструмента, который лучше всего обрабатывает, поэтому в этом случае я считаю, что сортировка имеет идеальный кандидат с '| sort' :) – fedorqui

0

Perl-решение, которое Безразлично» т прочитать файл дважды:

perl -lane 'push @{$s{$F[1]}},$_; 
      END{ 
       do{print join "\n", @{$s{$_}} if scalar(@{$s{$_}})>1}for(%s) 
      }' file 

Это проходит через файл и сохраняет каждую строку в хэш, ключом которого является 2ст поле и Whos e - это списки строк. Затем, в конце, он распечатает списки, чей ключ был просмотрен более одного раза.

0

С GNU AWK для истинных 2D массивов:

gawk ' 
{ vals[$2][++cnt[$2]] = $0 } 
END { 
    for (fruit in vals) 
     if (cnt[fruit] > 1) 
      for (i=1; i<=cnt[fruit]; i++) 
       print vals[fruit][i] 
} 
' file 
a apple 
f apple 
b peach 
d peach 
e peach 
Смежные вопросы