Con gnu sed sin control de la validez de la línea
sed -E 's/.*\.(\S+)\s+.*\.(\S+);.*/IP range is: \1-\2/'
Вы можете отсортировать (1 )их, переформатировать, чтобы использовать тот же разделитель (, например. sed (1 ))и обработайте результат с помощью программы, которая выполняет пользовательское сопоставление (Я бы написал это на perl (1 ), но есть много вариантов, возможно, Python больше знаком сегодня ).
команда
u=`awk 'NR==1{print $0}' fil1`
awk -v u="$u" 'BEGIN {print u}NR==FNR{a[$3];next}($4 in a){print $0}' fil2 fil1
выход
Col1 Col2 Col3 Col4 Col5
b 2 TT RR EE
c 3 QQ ZZ PP
Вы не говорите, ЧТО вы хотите сопоставить в файле1 (столбце, всей строке, регулярном выражении, строке, частичной или полной и т. д. )так что это предположение, но, возможно, это то, что вы пытаетесь выполнить (полное -сопоставление строки поля столбца 4 файла 1 с столбцом 3 файла 2):
$ awk 'NR==FNR{a[$3]; next} (FNR==1) || ($4 in a)' FS='[|]' file2 FS='\t' file1
Col1 Col2 Col3 Col4 Col5
b 2 TT RR EE
c 3 QQ ZZ PP
или, может быть, это (сравнение всех столбцов из файла2 с 3 конкретными столбцами из файла2 в полном -совпадении строки поля в порядке):
$ awk 'NR==FNR{a[$1,$2,$3]; next} (FNR==1) || (($1,$3,$4) in a)' FS='[|]' file2 FS='\t' file1
Col1 Col2 Col3 Col4 Col5
b 2 TT RR EE
c 3 QQ ZZ PP
но есть и десятки других возможностей.Проблема с приведенным вами примером заключается в том, что существует так много комбинаций совпадений, которые могут давать ожидаемый результат с учетом вашего опубликованного примера ввода.
Одним из способов использования Perl может быть:
$ perl -F'\t' -lane '$"="|";
$h{$_}++,next if @ARGV;
print if $h{"@F[0,2,3]"};
' File2 File1
Сначала прочитайте файл File2 и заполните хеш-ключ строками file2, содержащими символы вертикальной черты.
Затем прочтите файл file1 и попытайтесь сопоставить его поля 0,2 и 3, разделить на вкладку и соединить вертикальной чертой. За матч получить запись.