Сравните, если строки содержат фразу (регулярное выражение с / n или несколько строк?) - PullRequest
0 голосов
/ 09 марта 2020

Я боролся с этим уже несколько дней и не могу найти хорошее решение (или даже инструменты, которые можно использовать для продвижения вперед).

У меня около 5 тыс. Строк (в текстовом формате файл), как это:

РЕДАКТИРОВАТЬ - Я ЗАБЫЛ ДОБАВИТЬ, что некоторые строки имеют пробелы и одинарные кавычки / апострофы, поэтому я пересмотрел пример набора ниже. (пробелы отбрасывали некоторые из моих предыдущих усилий, добавлю это в качестве комментария об этом)

L:\folder7\video.1080p.disk.avi
L:\folder8\video3 cat 720p.img.mkv

L:\folder9\video.720p disk.avi
L:\folder0\video6.720p.img.mkv

L:\folder2\video's 1080p.disk.avi
L:\folder6\video2.1080p.img.mkv

разрывы строк - это разделители (или 2x разрывы строк (/ n / n) это разделитель, который я должен сказать)

Моя цель:

if line1 contains 1080p and line2 contains 720p, then delete the 720p line (line2)
if line1 contains 1080p and line2 contains 1080p, then delete both lines
if line1 contains 1080p and line2 contains 1080p, then delete both lines

(and the reverse) 
if line1 contains 720p and line2 contains 1080p, then delete the 720p line (line1)

Я в порядке, разбив это на ручные операции вручную (ie через несколько ручных операций grep / perl / notepad +++> (запускается temp.txt), в отличие от написания сценария if / elseif или Case, bash для выполнения этого за один прогон.

Я боролся (и читал тонны из Google / здесь), при использовании разрывов строк с помощью grep (даже с -o или с использованием tr '\ n' ';' и позже tr ';' '/ n') У меня также были проблемы с использованием регулярных выражений, которые отлично работают на регулярных выражениях regex101 .com, но не с egrep или perl.

Может кто-нибудь предложить какие-то предложения или указать мне в правильном направлении? спасибо


edit / final: см. мой выбранный ответ для объяснения , для тех, кому интересно, это последний awk, который я использовал (мой ввод был .txt файл из windows Приложение под названием «Duplicate Mov ie Finder для Plex», с ~ 5k строк), этот отличный awk сравнивает / n / n разделенные строки или записи и приблизительно выбирает файл более низкого качестваPath / duplicate mov ie.
I затем возьмите выходные данные этой команды awk, добавьте Del "путь" и запустите список через windows CMD (чтобы удалить дубликат низкого качества).
The {print $ 2; next} позволяет awk останавливать дальнейшую обработку и печатать правильную строку, если он находит файл h265 или hev c (поскольку я не хочу их удалять, ie: в случае, когда есть 2x строки 1080p, но одна из них является х c). Кстати, это требует много ручной проверки, прежде чем добавить / запустить команду Del. (не просто копировать / вставлять)

awk -v RS= -v FS='\n' '$1 ~ /265/ && $2 ~ /1080p/ { print $2 ; next } $1 ~ 
/1080p/ && $2 ~ /265/ { print $1 ; next } $1 ~ /HEVC/ && $2 ~ /1080p/ { print 
$2 ; next } $1 ~ /1080p/ && $2 ~ /HEVC/ { print $1 ; next } $1 ~ /1080p/ && 
$2 ~ /720p/ { print $2 } $1 ~ /720p/ && $2 ~ /1080p/ { print $1 } $1 ~ 
/1080p/ && $2 ~ /1080p/ { print $2 } $1 ~ /720p/ && $2 ~ /720p/ { print $1 }' 
plex_dups_v4.txt

Ответы [ 2 ]

1 голос
/ 09 марта 2020

P ... предоставил хорошее решение с помощью awk. Его можно настроить для работы с такими пробелами:

awk -v RS= -v FS='\n' '
    $1 ~ /1080p/ && $2 ~ /720p/ { print $1 ; next }
    $2 ~ /1080p/ && $1 ~ /720p/ { print $2 }
    ' input_file

Вы также можете сделать это с помощью sed:

sed -n '/^$/ d ; /720p/ { n ; /1080p/ p ; d } ; N ; /720p/ P' input_file
1 голос
/ 09 марта 2020

Я бы прочитал три строки за раз:

while IFS='' read -r first_line; do
    IFS='' read -r second_line
    IFS='' read -r empty_line
    if [[ "$first_line" == *"1080p"* ]]; then
        if [[ "$second_line" == *"1080p"* ]]; then
            rm -- "$first_line" "$second_line" # both 1080p -> remove both
        else
            rm -- "$second_line" # first is 1080p, second is 720p -> remove second
        fi
    else
        if [[ "$second_line" == *"1080p"* ]]; then
            rm -- "$first_line" # first is 720p, second is 1080p -> remove first
        else
            rm -- "$first_line" "$second_line" # both 720p -> remove both (?)
        fi
    fi
done < yourInputFile

Вы можете попробовать здесь .

Обратите внимание, что я предполагал, что файлы были либо 720p, либо 1080p. , если это не так, вам придется добавить elif с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...