Ваше регулярное выражение представляет собой смесь базового и расширенного регулярного выражения.
Как расширенное регулярное выражение (с использованием {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
и, следовательно, скучным.
Преимущество этого заключается в том, что подстановка также будет происходить в первом или последнем поле, даже если это поле не было ограничено |
с обоих концов.
Не совсем понятно, в чем проблема, но похоже, что вы сопоставляете файлы в первом столбце на основе ключей во втором, а затем снова объединяете их по группам ключей во втором столбце. Если это правильное понимание, то это может сработать.....
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
через отсортированный файл, объединяющий совпадения Кошка/Собака, пока не будет получено изменение комбинации Кошка/Собака, выводя агрегированную строку совпадающих ключей при каждом изменении комбинации Кошка/Собака, а также в конце.
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 я группирую по второму столбцу. А со вторым я группирую по рисунку собаки и кошки.
Однако результат не упорядочен так же, как в вашем примере. Надеюсь, все еще хорошо.
Один из способов (предполагая, что порядок вывода не важен):
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-й столбец в качестве ключа.