Удалить повторяющуюся строку, содержащую неизвестную строку - PullRequest
0 голосов
/ 01 мая 2020

file.txt

test (CODE:700|SIZE:2356)
asdasdad (CODE:700|SIZE:124)
xcvxcva (CODE:700|SIZE:8974)
asdavasdasdasd (CODE:700|SIZE:124)
link-categories (CODE:700|SIZE:8974)
edit (CODE:700|SIZE:124)

Мне нужна команда получить все дублированные значения SIZE:, затем удалить все дублированные строки, имеющие это значение, кроме одной строки, я имею в виду вывод должен выглядеть следующим образом:

test (CODE:700|SIZE:2356)
xcvxcva (CODE:700|SIZE:8974)
asdavasdasdasd (CODE:700|SIZE:124)

я нашел эту команду sed '/SIZE:124/,+1 d' file.txt in Удалить только дублирующую строку, содержащую указанную c строку

, но это команда удалила все строки, мне нужно удалить дубликаты, кроме одной строки + эта команда не будет искать дублированное значение SIZE:, поэтому оно не работает!

Что мне нужно:

  • поиск дублированного значения SIZE:, например, 124 выше!
  • удалить это значение во всех строках, кроме одной или двух строк, если вы можете.

Ответы [ 2 ]

3 голосов
/ 01 мая 2020

Это можно сделать с помощью этого простого awk также:

awk -F '[ |]+' '!seen[$NF]++{print}' file

test (CODE:700|SIZE:2356)
asdasdad (CODE:700|SIZE:124)
xcvxcva (CODE:700|SIZE:8974)
1 голос
/ 01 мая 2020

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

awk 'match($0,/SIZE:[0-9]+/){val=substr($0,RSTART,RLENGTH);array[val]=$0;val=""} END{for(key in array){print array[key]}}' Input_file

ИЛИ добавление формы решения, отличного от одного вкладыша:

awk '
match($0,/SIZE:[0-9]+/){
  val=substr($0,RSTART,RLENGTH)
  array[val]=$0
  val=""
}
END{
  for(key in array){
     print array[key]
  }
}
' Input_file

Объяснение: Добавление подробного пояснения к вышеуказанному коду.

awk '                                 ##Starting awk program from here.
match($0,/SIZE:[0-9]+/){              ##Using match function to match regex of SIZE: then digits in each line here.
  val=substr($0,RSTART,RLENGTH)       ##Creating variable val whose value is sub string of current line which has matched value from current line.
  array[val]=$0                       ##Creating an array named array with index of variable val and value is current line.
  val=""                              ##Nullify variable val here.
}
END{                                  ##Starting END block of this awk program here.
  for(key in array){                  ##Traversing through array here.
     print array[key]                 ##Printing array value here.
  }
}
' Input_file                          ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...