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

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

Eu tenho um arquivo CSV (digamos temp.csv) com strings e números. Preciso excluir as linhas que contêm um padrão específico de string no início das linhas do arquivo. Por exemplo, aqui está 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 req_file_currem um comando ~ $ req_file_curr=req1

echo "${req_file_curr}"dá saída comoreq1

No entanto, ao usá-lo em umsedcomando, 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 esperando 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 emsedouawk?

Responder1

Você precisa colocar o sedpadrão 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 ^âncora para indicar sedque esse padrão precisa ocorrer no início da linha.

Responder2

Não há necessidade de awkou sedaqui:

grep -v "^$req_file_curr," file

Observe que (como for sedou awkembora em menor grau), isso pressupõe que $req_file_currnão contém operadores regexp (como ., *...).

Se isso acontecer, você teria que escapar desses caracteres, ou com awk, você poderia usar uma abordagem usando sua index()função:

S="$req_file_curr," awk 'index($0, ENVIRON["S"]) != 1' < file

Responder3

Você configurou, req_file_currmas usa req_file. E seu sedcomando não funcionará, pois a variável shell não pode ser expandida em seu sedcomando.

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 sedcom 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

Responder4

Uma solução ed seria algo parecido.

  req_file_curr=req1

  printf '%s\n' "g/^$req_file_curr/d"  w | ed -s temp.csv

Ele edita o arquivo no local, então teste primeiro antes de executar isso em seus arquivos.

informação relacionada