Удаление дублирующихся строк после сравнения первого шаблона и специального шаблона

grep -oP 'name="\K[^"]*' имя файла

Вывод:

What_I_Want_To_Extract

Смотрите: http://www.charlestonsw.com/perl-regular-expression-k-trick/

Ваша версия адаптирована:

grep -o 'name='. *">" HTMLFILE | sed 's/name="\|">//g' NEWFILE

1
18.11.2014, 09:32
1 ответ

Я предполагаю, что если есть дубликаты записей, то всегда будет одна с ca в качестве второго поля.

В данных вашего примера все строки, которые имеют одно и то же первое поле, сгруппированы вместе, но вы не упомянули, всегда ли это так. Если это так, то задача немного проще, но скрипт awk, приведенный ниже, будет работать, даже если совпадающие строки не сгруппированы.

dedup.awk

#!/usr/bin/awk -f

{
    if (!($1 in lines) || ($2 == "ca"))
        lines[$1] = $0
}

END{
    for (i in lines) 
        print lines[i]
}

Если входной файл называется data, вы бы запустили его как:

awk -f dedup.awk data

или

awk -F '\t' -f dedup.awk data

, чтобы убедиться, что он использует tab в качестве разделителя полей; по умолчанию разделителем полей является один или несколько пробелов & / / или закладок. Дополнительную информацию см. в Fields на странице gawk man page.

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

Этот скрипт awk можно сжать, если хотите:

awk '{if(!($1 in a)||($2=="ca"))a[$1]=$0};END{for(i in a)print a[i]}' data
2
27.01.2020, 23:37

Теги

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