Apagar linhas de um arquivo usando awk ou sed com base na variável do comando anterior

2

Eu tenho um arquivo CSV (digamos temp.csv) com seqüências de caracteres e números. Eu preciso excluir as linhas que contêm um padrão específico de seqüência de caracteres no início das linhas no arquivo. Por exemplo, aqui está o meu arquivo -

req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

Estou escrevendo um padrão para req_file_curr em um comando ~ $ req_file_curr=req1

echo "${req_file_curr}" fornece a saída como req1

No entanto, ao usá-lo em um comando sed , como abaixo:

sed '/\"${req_file_curr}\"/d' temp.csv

dá saída como

req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

Estou expondo a saída como

req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

Como posso usar a variável de um shell como um padrão para procurar em sed ou awk ?

    
por Dhruuv 12.05.2014 / 21:21

3 respostas

5

Você precisa colocar o padrão sed entre aspas duplas para que o shell possa expandir a variável antes de passá-la para sed :

sed "/^${req_file}/d" temp.csv

Você também precisa usar a ^ anchor para indicar a sed que esse padrão precisa ocorrer no início da linha.

    
por 12.05.2014 / 21:29
5

Não há necessidade de awk ou sed aqui:

grep -v "^$req_file_curr," file

Observe que (como para sed ou awk , embora em menor grau), que pressupõe que $req_file_curr não contém operadores regexp (como . , * ...).

Se isso acontecer, você teria que escapar desses personagens.

    
por 12.05.2014 / 21:53
4

Você definiu req_file_curr , mas usa req_file . E o comando sed não funcionará, já que a variável shell não pode ser expandida no comando sed .

Você pode tentar isso:

$ sed '/'"${req_file_curr}"'/d' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

ou usando sed com aspas duplas:

sed "/${req_file_curr}/d" file

e usando awk :

$ awk -v req=$req_file_curr '$0 !~ req' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
    
por 12.05.2014 / 21:27