Data.txt :

aaab;10
bbbc;20
abc;30
cc;40

Pattern.txt :

aaa
aa
bbb
ccc
3
c+

Требуемый выход:

aaab;10;2
bbbc;20;2
abc;30;1
cc;40;1

Следовательно, если какая-либо из строк в pattern.txt существует в column1 в data.txt, добавьте 2 к data.txt, если нет, добавьте 1. Строки могут содержать буквы, цифры, пробелы и т. Д., Более или менее любой символ.

-2
Markus 28 Май 2017 в 01:03

2 ответа

Лучший ответ

Исходя из одной возможной интерпретации того, что вы сказали нам в тексте вашего вопроса и в комментариях, это, вероятно, то, что вам действительно нужно:

$ awk '
    BEGIN { FS=OFS=";" }
    NR==FNR { strs[$0]; next }
    { c=1; for (str in strs) if (index($1,str)) {c=2; break} print $0, c }
' patterns.txt data.txt
aaab;10;2
bbbc;20;2
abc;30;1
cc;40;1

Различия между этим и вашим текущим принятым ответом будут очевидны, когда ваш ввод содержит строки в patterns.txt, которые появляются во 2-м поле data.txt или содержат метасимволы регулярных выражений, или если ваши файлы большие или ....

1
Ed Morton 28 Май 2017 в 15:11

Это будет работать с gnu awk, но может быть не так быстро, как могло бы быть:

$ cat data 
aaab;10
bbbc;20
abc:30
cc:40

$ cat patterns
aaa
aa
bbb
ccc

$ awk -F"[:;]" 'FNR==NR{hash[$1]; next}{hash2[++c]=$0 ";" 1} \
{for (i in hash) if ($0~i) {hash2[c]=$0 ";" 2;break}} \
END{for (k=1;k<=length(hash2);k++) print hash2[k]}' patterns data
aaab;10;2
bbbc;20;2
abc:30;1
cc:40;1

Лично я бы пошел с grep:

grep -f patterns data   #this will bring the matching data
grep -v -f patterns data #this will bring the non matching data

Все вместе :

printf '%s;%s\n' "$(grep -f patterns data)" "2" && printf '%s;%s\n' "$(grep -v -f patterns data) "1" 
1
George Vasiliou 28 Май 2017 в 00:57