Как удалить строки, которые соответствуют слову в том же файле? - PullRequest
0 голосов
/ 26 марта 2019

Я ищу функцию или скрипт, который читает каждую строку и ищет дубликат или совпадение в том же файле, чтобы затем удалить его.

Функция uniq -u выполняет половину работы.Я пытался использовать время чтения с grep.Как-то это работает, но по какой-то причине он выводит вдвое больше строк, которые ищет.

Это код, который у меня есть на данный момент, чтобы идентифицировать подходящее слово.Я еще не придумал код для удаления соответствующего слова, но я бы, скорее всего, использовал sed

filename=$1
while read line; do
  grep "$line" $filename
done < $filename

, и у меня есть этот файл

JonasB/JB
AZ
LeylaS/LS
JB
AmeliaZ/AZ

.ожидаемый результат должен быть:

JonasB/"JB"
"AZ"
LeylaS/LS
"JB"
AmeliaZ/"AZ"

Но результат, который я имею, таков:

JonasB/"JB"
"AZ"
AmeliaZ/"AZ"
"LeylaS/LS"
JonasB/"JB"
"JB"
"AmeliaZ/AZ"

Результат, который я хотел бы получить для этого сценария:

LeylaS /LS

Разъяснение

Предыдущий пример вызвал некоторую путаницу, и я прошу прощения за него.

Это другой пример:

ecar/ElectricCar/EV
ElectricCar
EV/ecar
Car/ICE
Van
Hybrid
Truck/Van/MiniVan/BigCar
ElectricVan/ElectricTruck

Таким образом, FS будет /.

Строки 2 и 3 должны быть удалены, поскольку они соответствуют полям строки 1

Строка 5 должна быть удалена со строкой 7, поскольку она соответствуетвторое поле

Результат, который я ожидаю получить:

Car/ICE
Hybrid
ElectricVan/ElectricTruck

Надеюсь, это лучше прояснит проблему.

Ответы [ 3 ]

0 голосов
/ 26 марта 2019

Попробуйте:

nl -nrz -w6 -s " " "$filename" | sort -k2 | uniq -s7 | sort -n | cut -c8-

nl нумерует строку (6 цифр, 1 пробел, макс. 1 млн. Строк). сортировка сортировка, начиная с части 2 (без учета номера строки). уникальный удаляет дубликаты, игнорируя 7 символов (номера строк). сортировка сортировка в исходном порядке.Наконец cut удаляет номера строк.

0 голосов
/ 24 апреля 2019

попробовал на GNU SED

sed -nE 'G; /^([[:print:]]+\n)(.+\n)*\1/b; h;P' filename
0 голосов
/ 26 марта 2019

Вместо этого используйте awk.

BEGIN { FS = "/" } # / is field separator.
($NF in a) {       # if last field is in a;
  delete a[$NF]    # delete it,
  next
} {                # otherwise;
  a[$NF] = $0      # add it to a.
} END {            # at the end;
  for (b in a)     # print everything in a.
    print a[b]
}

Призвание:

awk -F '/' '($NF in a){delete a[$NF];next} {a[$NF]=$0} END{for(b in a) print a[b]}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...