Grep uma variável em um arquivo

Grep uma variável em um arquivo

Um arquivo é modificado por um script usando um arquivo de entrada-

141,141_1,BAR,HONDA,ps2_0,não atribuído,ps3_0,Não atribuído,ps4_0,Não atribuído,ps5_0,Não atribuído,ps6_0,Não atribuído,ps7_3,TILL WILL,.....

Arquivo de entrada-

141,ps7,ATÉ

Agora preciso pesquisar se a coluna ps7_3 está atualizada com o valor correto.

Então, do arquivo de entrada, separei as colunas-

while read -r line;
do
sub1=$(echo $line|cut -f 1 -d ',');
sub2=$(echo $line|cut -f 2 -d ',');
sub3=$(echo $line|cut -f 3 -d ',');
sub4=$(echo $sub2'.*,'$sub3|sed -e "s/\(.*\)\r/'\1'/");
echo $sub1;
echo $sub2;
echo $sub3;
echo $sub4;
grep $sub4 modded_file.csv.dat;
done<input.csv

A saída sendo-

141
ps7
TILL WILL
'ps7.*,TILL WILL'
grep: WILL': No such file or directory

Mas quando eu corro grep 'ps7.*,TILL WILL' modded_file.csv.dat, funciona. Como posso usar grep em uma variável conforme mostrado acima, em um arquivo?

Responder1

Como você pode ver na sua entrada, você tem um símbolo de espaço na variável sub4, então reescreva esta linha:

grep $sub4 modded_file.csv.dat;

ser

grep -- "$sub4" modded_file.csv.dat;

(Adições de @philippos) E $sub4não deve conter aspas simples ', pois seriam consideradas parte do padrão de pesquisa.

Acho que seu equívoco é a ordem de como a cotação e a expansão são executadas: você acha que primeiro as variáveis ​​serão expandidas e depois a cotação será executada; portanto, após a expansão, as aspas simples da variável citariam a string. Mas na verdade a cotação é feita antes da expansão da variável, então você precisa citar o$sub

Responder2

Correr grepdentro de um loop é um enorme antipadrão. Em vez disso, tente isso.

awk -F "," 'NR==FNR { key[$1]=$2; value[$1]=$3; next }
    ($1 in key) && ($0 !~ "^" $1 ",.*," key[$1] "," value[$1] ",")' input.csv modded_file.csv.dat

Eu não tentei entender por que você quer ou espera isso \rde alguma forma, então isso provavelmente requer alguns ajustes.

Um script Awk consiste em uma sequência de pares {de ação *condição }, que são aplicados um por vez em cada linha de entrada. Você pode usar nextpara pular o script restante desta linha de entrada e pular para a próxima entrada, e você pode omitir o{Ação}parte se você simplesmente deseja imprimir a linha de entrada inteira. (Você também pode omitir odoença se você quiser fazer algo incondicionalmente.) Cada linha é dividida em campos que estão disponíveis como $1, $2, etc dentro do script. -F ","define o separador de campos como vírgula (o padrão é uma sequência de espaços em branco).

O NR==FNRidioma é uma forma comum de processar dois arquivos de entrada no Awk. O número geral da linha NRserá igual ao número da linha dentro do arquivo FNRquando você estiver processando o primeiro arquivo de entrada e falso posteriormente.

Quando estamos lendo o primeiro arquivo, armazenamos os campos em dois arrays associativos, ambos codificados pelo primeiro campo.

Quando estamos lendo o segundo arquivo, imprimimos cada linha de entrada onde a chave é encontrada no keyarray, e a linha inteira não corresponde à expressão regular esperada (o primeiro campo é chave, seguido por qualquer coisa, seguido por uma vírgula, a coluna nome que armazenamos key[$1], outra vírgula, o valor esperado que armazenamos value[$1]e ainda outra vírgula).

Em outras palavras, encontra as linhas onde a condição esperada não foi atendida. Retire !se quiser os fósforos.

informação relacionada