Como comparar linhas em um único arquivo linha por linha e acrescentar a saída ao mesmo arquivo

0

Eu tenho um arquivo abc.csv que tem o conteúdo abaixo.

a6caa290d03ae75dd5f3bf9214f0b523;CO.jar,a6caa290d03ae75dd5f3bf9214f0b523;CO.jar,
a1a5bf1547f50feea4120290343f89e4;Common.jar,a1a5bf1547f50feea4120290343f89e4;Common.jar,
1264897ea44d85c3f0dba127ff02f514;DA.jar,1264897ea44d85c3f0dba127ff02f514;DA.jar,
e77834d4ba2a4193b94fee9470a458a4;FW.jar,e77834d4ba2a4193b94fee9470a458a4;FW.jar,

Eu preciso ler o arquivo linha por linha e comparar os valores que são antes e depois de , Se ambos forem iguais, escreva SUCCESS na mesma ponta da linha outra FAILURE na mesma extremidade da linha linha.

Eu tentei o abaixo.

for I in 'cat abc.csv'
do
   VAR1='echo $I | awk -F"," {'print ${1}'}
   VAR2='echo $I | awk -F"," {'print ${2}'}
   if [ ${1} == ${2} ]
   then
       ..
   fi
done

Não sei como adicionar SUCCESS ou FAILURE no final de cada linha. Alguma idéia de como isso pode ser alcançado!

    
por sabarish jackson 09.08.2018 / 17:08

4 respostas

1

Tente isso,

for I in 'cat abc.csv'
do
        var1='echo "$I" | awk -F "," '{print $1}''
        var2='echo "$I" | awk -F "," '{print $2}''
        if [ $var1 == $var2 ]; then
               sed -i 's/'$var1','$var2'/'$var1','$var2',SUCCESS/' abc.csv
        else
               sed -i 's/'$var1','$var2'/'$var1','$var2',FAIL/' abc.csv
        fi

done

E um revestimento:

 echo "'awk -F"," '{ if($1 == $2)  {print $1","$2",SUCCESS"} else {print $1","$2",FAILURE"} }' abc.csv'" > abc.csv
    
por 09.08.2018 / 17:28
3

Você pode fazer tudo no awk. awk executa seu script para cada linha em sua entrada

A instrução awk print x y imprime as expressões x e y ao lado uma da outra, sem nenhum separador em branco ou de campo entre elas.

A expressão awk a ? b : c significa "se a for true, então b else c ".

awk -F"," '{ print $0 (($1 == $2) ? "SUCCESS" : "FAILURE") }' < abc.csv
    
por 09.08.2018 / 17:36
0

Tente também

sed -r 's/^(.*,)/& SUCCESS/; t;  s/$/ FAILURE/;' file

Certifique-se de que seus arquivos de entrada percam os terminadores de linha do DOS ( <CR> = \ r = 0x0D = ^ M) antes de executar isso. Se estiver satisfeito com o que você vê, redirecione para um arquivo de resultado

    
por 09.08.2018 / 18:39
0

Usando o GNU sed (o comando t precisa de um rótulo se terminar com ; no padrão sed ):

$ sed '/^\([^,]*,\)/s/$/SUCCESS/;t;s/$/FAILURE/' file
a6caa290d03ae75dd5f3bf9214f0b523;CO.jar,a6caa290d03ae75dd5f3bf9214f0b523;CO.jar,SUCCESS
a1a5bf1547f50feea4120290343f89e4;Common.jar,a1a5bf1547f50feea4120290343f89e4;Common.jar,SUCCESS
1264897ea44d85c3f0dba127ff02f514;DA.jar,1264897ea44d85c3f0dba127ff02f514;DA.jar,SUCCESS
e77834d4ba2a4193b94fee9470a458a4;FW.jar,e77834d4ba2a4193b94fee9470a458a4;FW.jar,SUCCESS

Um exemplo em que duas linhas geram FAILURE :

$ sed '/^\([^,]*,\)/s/$/SUCCESS/;t;s/$/FAILURE/' file
a6caa290d03ae75dd5f3bf9214f0b523;CO.jar,a6caa290d03ae75dd5f3bf9214f0b523;CO.jar,SUCCESS
1a5bf1547f50feea4120290343f89e4;Common.jar,a1a5bf1547f50feea4120290343f89e4;Common.jar,FAILURE
1264897ea44d85c3f0dba127ff02f514;DA.jar,1264897ea44d85c3f0dba127ff02f514;DA.jar,SUCCESS
77834d4ba2a4193b94fee9470a458a4;FW.jar,e77834d4ba2a4193b94fee9470a458a4;FW.jar,FAILURE

O script sed com anotações:

/^\([^,]*,\)$/s/$/SUCCESS/;   # this lines looks like XXX,XXX,
                                # add SUCCESS at the end of the line
t;                              # branch to end of script if last s command did something
s/$/FAILURE/                    # add FAILURE at the end of the line

Para realizar uma edição no local com o GNU sed , use o comando acima, mas com sed -i no lugar de sed .

Explicação de /^\([^,]*,\)/ : se essa expressão regular corresponder, a substituição seguinte será executada e adicionará SUCCESS no final da linha. A expressão regular corresponde a uma cadeia no início de uma linha até e incluindo a primeira vírgula. Em seguida, ele tenta corresponder essa mesma sequência novamente imediatamente após a primeira. O fará referência à string correspondida por \(...\) .

    
por 09.08.2018 / 18:49

Tags