
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 $sub4
nã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 grep
dentro 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 \r
de 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 next
para 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==FNR
idioma é uma forma comum de processar dois arquivos de entrada no Awk. O número geral da linha NR
será igual ao número da linha dentro do arquivo FNR
quando 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 key
array, 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.