Преобразование текстового файла в табличный формат

Ваше регулярное выражение представляет собой смесь базового и расширенного регулярного выражения.

Как расширенное регулярное выражение (с использованием {13}и \|в качестве литерала):

sed -E 's/\|37[0-9]{13}\|/|37xxxxxxxxxxxxx|/g'

Альтернативно, в качестве базового регулярного выражения (с использованием \{13\}и |в качестве литерала):

sed 's/|37[0-9]\{13\}|/|37xxxxxxxxxxxxx|/g'

Это превращает вашу строку примера в

dlkfhfd|fedfe|dfwe3f347fde|3745978|dlkfhr**|37xxxxxxxxxxxxx|**fedfe|dfwe3f347fde

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


Вawk:

awk -F '|' -vOFS='|' '
    {
        for (i=1; i<=NF; ++i))
            if (length($i)==15 && match($i,"^37[0-9]"))
                $i="37xxxxxxxxxxxxx"
        print 
     }'

Здесь можно было бы использовать gsub(), но это сделало бы его более или менее идентичным решению sedи, следовательно, скучным.

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

0
02.01.2020, 17:00
3 ответа

Не совсем понятно, в чем проблема, но похоже, что вы сопоставляете файлы в первом столбце на основе ключей во втором, а затем снова объединяете их по группам ключей во втором столбце. Если это правильное понимание, то это может сработать.....

join -j 2 file2 file1 | sort -k 2 | awk '
    BEGIN{getline; k=$1; f=$2" "$3}
        { while (f==$2" "$3){k=k" "$1; next} print f, k; f=$2" "$3; k=$1}
    END{print f, k}'

Сначала joinво втором поле, а остальные поля вывести как второе и третье поля

Затем sortкомбинированный файл на 2-м (и по умолчанию 3-м )полях для группировки совпадений Кошка/Собака.

Наконец, awkчерез отсортированный файл, объединяющий совпадения Кошка/Собака, пока не будет получено изменение комбинации Кошка/Собака, выводя агрегированную строку совпадающих ключей при каждом изменении комбинации Кошка/Собака, а также в конце.

0
28.01.2020, 02:58
cat File1 File2 | awk '{if (a[$2])a[$2]=a[$2]" "$1; else a[$2]=$1;}END{for (i in a) print i "-" a[i];}' | awk -F "-" '{if (a[$2])a[$2]=a[$2]" "$1; else a[$2]=$1;}END{for (i in a) print i " " a[i];}'

С помощью первой команды awk я группирую по второму столбцу. А со вторым я группирую по рисунку собаки и кошки.

Однако результат не упорядочен так же, как в вашем примере. Надеюсь, все еще хорошо.

0
28.01.2020, 02:58

Один из способов (предполагая, что порядок вывода не важен):

join -1 2 -2 2 -o 1.1 2.1 1.2 file1 file2 | awk '{a[$1 FS $2] = a[$1 FS $2] FS $3;}END{for(i in a ){print i, a[i];}}'

Используя join, file1и file2соединяются с помощью 2-го столбца. Используя awk, мы накапливаем результаты, используя 1-й столбец в качестве ключа.

0
28.01.2020, 02:58

Теги

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