Alterar linhas no arquivo somente se elas corresponderem aos padrões em outro arquivo

2

Digamos que eu tenha esses dois arquivos:

inp

11 hello
22 wonderful
33 beach
44 today
55 is
66 great

pats

11
44
55

Eu quero fazer algo no inp, mas apenas para linhas que estão em pats. Por exemplo. digamos que quero acrescentar + no final. Eu gostaria que o resultado final fosse

fora

11 hello+
22 wonderful
33 beach
44 today+
55 is+
66 great

Existe uma maneira fácil de fazer isso com sed, awk ou algo parecido? Com facilidade, eu gostaria de não ter que escrever um programa (por exemplo, python), estou mais procurando por algo como grep -f pats inp + sed 's/$/+/' juntos.

Editar:

Eu gostaria que funcionasse com o padrão encontrado em qualquer lugar da linha, por exemplo:

inp

11 hello
wonderful22
beach 33 front
to44day
is55
gr 66 eat

pats

11
44
55

fora

11 hello+
wonderful22
beach 33 front
to44day+
is55+
gr 66 eat
    
por levant pied 11.10.2016 / 22:06

3 respostas

2

sintaxe bash:

sed -f <(printf 's/^%d\>.*/&+/\n' $(<pats)) inp

A parte dentro da parte <() imprime um programa sed para transformar as linhas apropriadas:

$ printf 's/^%d\>.*/&+/\n' $(<pats)
s/^11\>.*/&+/
s/^44\>.*/&+/
s/^55\>.*/&+/

A sintaxe <() é a substituição do processo bash, então você pode pegar a saída de um comando e trabalhar com ele como se fosse um arquivo. Então temos sed -f sed_program inp para transformar o arquivo

    
por 11.10.2016 / 22:40
2
awk 'NR==FNR {pats[$1]++; next} $1 in pats {$2=$2"+"} 1' pats inp
11 hello+
22 wonderful
33 beach
44 today+
55 is+
66 great

Para verificar uma correspondência em qualquer lugar em cada linha de inp , você poderia usar uma abordagem essencialmente semelhante, mas extrair a parte para comparar usando match

awk 'NR==FNR {pats[$1]++; next} match($0,/[0-9]+/) && substr($0,RSTART,RLENGTH) in pats {$0=$0"+"} 1' pats inp2
11 hello+
wonderful22
beach 33 front
to44day+
is55+
gr 66 eat

(Se você quiser combinar com padrões arbitrários do arquivo pats , uma abordagem diferente seria necessária, por exemplo, o loop dos elementos da matriz pats explicitamente.)

    
por 11.10.2016 / 22:32
0

tente isso ...

awk 'NR==FNR{Arr[$0];next}{for(i=1;i<=NF;i++)for(j in Arr)if(match($i,j)){F=1;$0=$0"+"}else{F=0}}1' pat.txt input.txt
    11 hello+
    wonderful22
    beach 33 front
    to44day+
    is55+
    gr 66 eat
    
por 12.10.2016 / 17:13