1-е решение: Generi c и более быстрое решение, чем мое второе решение здесь. Это будет искать строку от [
до ]
в Input_file2 независимо от жесткой кодировки поля здесь.
awk '
{ gsub(/\r/,"") }
FNR==NR{
array[$0]
next
}
match($0,/\[[^]]*/){
val=substr($0,RSTART+1,RLENGTH-1)
}
(val in array)
' file1 file2
Пояснение: Добавлено подробное объяснение для выше.
awk ' ##Starting awk program from here.
{ gsub(/\r/,"") }
FNR==NR{ ##Checkiing condition FNR==NR which will be TRUE hen file1 is being read.
array[$0] ##Creating array with index of current line.
next ##next will skip all statements from here.
}
match($0,/\[[^]]*/){ ##Using match to match from [ to till ] in line.
val=substr($0,RSTART+1,RLENGTH-1) ##Creating val which has sub-string from RSTART to RLENGH here.
}
(val in array) ##Checking condition if val is present in array then print that line.
' file1 file2 ##Mentioning Input_file names here.
2-е решение: Не могли бы вы попробовать следующие, написанные и протестированные с показанными образцами. Это более общее c решение, поскольку номер поля НЕ жестко закодирован в решении, но этот код будет работать независимо от номеров полей здесь.
awk '{ gsub(/\r/,"") } FNR==NR{array[$0];next} {for(i in array){if(match($0,i)){print;next}}}' file1 file2
Пояснение: Добавление подробного объяснения вышеизложенного.
awk ' ##Starting awk program from here.
{ gsub(/\r/,"") }
FNR==NR{ ##Checking condition FNR==NR if that's true then do following.
array[$0] ##Creating an array with index of current line.
next ##next will skip further statements from here.
}
{
for(i in array){ ##Looping through array here.
if(match($0,i)){ ##Checking if current key is present in current line then do following.
print ##Printing current line here.
next ##next will skip further statements from here.
}
}
}
' file1 file2 ##Mentioning Input_file names here.