Как получить только повторные строки для указанного столбца c в bash - PullRequest
2 голосов
/ 17 апреля 2020

Представьте, что у меня есть этот файл в bash:

1 3 6 name1
1 2 7 name2
3 4 2 name1
2 2 2 name3
7 8 2 name2
1 2 9 name4

Как я могу извлечь только те строки, которые представляют повторяемое поле "имя", и отсортировать их?

Мой ожидаемый вывод будет:

1 3 6 name1
3 4 2 name1
1 2 7 name2
7 8 2 name2

Я пытался использовать sort -k4,4 myfile | uniq -D, но я не нашел, как сказать uniq для работы с 4-м столбцом. Спасибо!

Ответы [ 3 ]

3 голосов
/ 17 апреля 2020

Вы были близки. Вам нужно пропустить поля, предшествующие последнему.

$ sort -k4 file | uniq -f3 -D
1 3 6 name1
3 4 2 name1
1 2 7 name2
7 8 2 name2
2 голосов
/ 17 апреля 2020

Не могли бы вы попробовать следующее.

awk '
{
  a[$NF]++
  b[$NF]=(b[$NF]?b[$NF] ORS:"")$0
}
END{
  for(i in a){
    if(a[i]>1){
      print b[i]
    }
  }
}
'  Input_file

ИЛИ, если вы хотите отсортировать вывод, попробуйте выполнить следующее.

awk '
{
  a[$NF]++
  b[$NF]=(b[$NF]?b[$NF] ORS:"")$0
}
END{
  for(i in a){
    if(a[i]>1){
      print b[i]
    }
  }
}
'  Input_file  |  sort -k4
1 голос
/ 17 апреля 2020

Вы можете использовать это awk + sort:

awk 'FNR==NR{freq[$NF]++; next} freq[$NF] > 1' file{,} | sort -k4

1 3 6 name1
3 4 2 name1
1 2 7 name2
7 8 2 name2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...