Удалить строки с повторяющимся первым полем/столбцом из большого файла

while read x y z; do
   ./script "$x" "$y" "$z"
done < FILENAME

примечание FILENAMEи неиспользованиеin text

Проверьте Часто задаваемые вопросы по bash #1

2
29.11.2019, 17:17
1 ответ

Это именно то, что awkпревосходно:

$ awk '{ if(NR==1 || $1 == last+1){print; last=$1}}' file
 40812        20406.000000         0.843859468      1083.209050130      -994.562279080      -993.349611938        22.120868921
 40813        20406.500000         0.829362077      1064.599666089      -994.546948121      -993.348764740        22.087239027
 40814        20407.000000         0.822524589      1055.822814442      -994.540118434      -993.348757318        22.083606005
 40815        20407.500000         0.823511602      1057.089780943      -994.541681744      -993.349315083        22.432111979
 40816        20408.000000         0.824550451      1058.423286012      -994.543159511      -993.349731194        22.481428146
 40817        20408.500000         0.819160081      1051.504008955      -994.537767061      -993.349702160        22.268819809
 40818        20409.000000         0.807571275      1036.628191427      -994.525675417      -993.349169067        22.332761049
 40819        20409.500000         0.797104599      1023.192780242      -994.514563564      -993.348491176        22.622548103
 40820        20410.000000         0.796605925      1022.552664951      -994.513928312      -993.348319789        22.193170071

Или немного поиграл в гольф:

$ awk '(NR==1 || $1 == last+1) && last=$1' file
 40812        20406.000000         0.843859468      1083.209050130      -994.562279080      -993.349611938        22.120868921
 40813        20406.500000         0.829362077      1064.599666089      -994.546948121      -993.348764740        22.087239027
 40814        20407.000000         0.822524589      1055.822814442      -994.540118434      -993.348757318        22.083606005
 40815        20407.500000         0.823511602      1057.089780943      -994.541681744      -993.349315083        22.432111979
 40816        20408.000000         0.824550451      1058.423286012      -994.543159511      -993.349731194        22.481428146
 40817        20408.500000         0.819160081      1051.504008955      -994.537767061      -993.349702160        22.268819809
 40818        20409.000000         0.807571275      1036.628191427      -994.525675417      -993.349169067        22.332761049
 40819        20409.500000         0.797104599      1023.192780242      -994.514563564      -993.348491176        22.622548103
 40820        20410.000000         0.796605925      1022.552664951      -994.513928312      -993.348319789        22.193170071

Пояснение

  • if(NR==1 || $1 == last+1):NR— номер текущей строки. Таким образом, NR == 1будет верным только при чтении первой строки файла. Нам это нужно, поэтому мы всегда будем печатать первую строку. Тогда $1 == last +1будет истинным, если первое поле строки($1)равно значению, хранящемуся в переменной lastплюс 1. В совокупности это означает «если это последняя строка или если первое поле равно to last + 1", что определяет ваши целевые строки.
  • print; last=$1:Если одно из двух описанных выше условий верно, напечатайте строку и установите значение lastв качестве первого поля этой строки , чтобы мы могли обработать следующую.
6
27.01.2020, 21:53

Теги

Похожие вопросы