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_curr
em um comando
~ $ req_file_curr=req1
echo "${req_file_curr}"
dá saída comoreq1
No entanto, ao usá-lo em umsed
comando, 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 emsed
ouawk
?
Responder1
Você precisa colocar o sed
padrã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 sed
que esse padrão precisa ocorrer no início da linha.
Responder2
Não há necessidade de awk
ou sed
aqui:
grep -v "^$req_file_curr," file
Observe que (como for sed
ou awk
embora em menor grau), isso pressupõe que $req_file_curr
nã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_curr
mas usa req_file
. E seu sed
comando não funcionará, pois a variável shell não pode ser expandida em seu sed
comando.
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
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.