pesquisa coluna 2 no arquivo csv para valor, se valor, insira “inválido” e altere as células para a direita

3

Eu tenho o arquivo csv gerado automaticamente por um script, mas para alguns dos registros (itens de linha) recebidos eu preciso pesquisar na coluna 2 e se os valores contiverem "* .app" eu preciso imprimir "INVALID" na coluna 2 para todos os registros que correspondem e deslocam as células para a direita.

Exemplo de arquivo de dados:

   DOM,PROJ,APP,USER,DATE,TIME,STATUS
   www,test,biz.app,bob,6-1-18,09:33,OK   //Example of good line    
   www,biz.app,tony,7-11-17,06:22,ok      //Example of bad line
   ...

   Wanted output:
   DOM,PROJ,APP,USER,DATE,TIME,STATUS
   www,test,biz.app,bob,6-1-18,09:33,OK     
   www,INVALID,biz.app,tony,7-11-17,06:22,ok   //Example of fixed line
   ...

Eu tentei sem sucesso awk, sed e, se declaração, mas não obtive os resultados que eu preciso

    e.g.

    if [ awk -F',' '{ print $2 } < FILE' ] == "*.app" ; then ; echo "INVALID"; fi

O que é obviamente terrível ... Novo para bater graças a todos!

    
por SSDdude 25.06.2018 / 21:45

3 respostas

0

awk -F, -vOFS=, '$2 ~ /\.app$/ { for (i = NF + 1; i > 2; --i) $i = $(i-1); $2 = "INVALID" } 1' file >newfile

Isso criaria newfile de file . O comando awk define o delimitador de campo de entrada e saída como uma vírgula e, em seguida, testa o valor da coluna dois em relação a uma expressão regular que corresponde à sequência .app no final do valor. Se o teste for bem-sucedido, os campos do registro serão deslocados para um passo para criar a string INVALID como o novo segundo campo.

O 1 à direita pode ser substituído por { print } (faz com que todas as linhas sejam exibidas).

Com os dados de exemplo fornecidos, o arquivo de saída conteria

DOM,PROJ,APP,USER,DATE,TIME,STATUS
www,test,biz.app,bob,6-1-18,09:33,OK
www,INVALID,biz.app,tony,7-11-17,06:22,ok
    
por 25.06.2018 / 21:55
0

Awk abordagem:

awk 'BEGIN{ FS = OFS = "," }NR > 1 && $2 ~ /.*\.app/{ $2 = "INVALID" OFS $2 }1' file
  • NR > 1 && $2 ~ /.*\.app/ - se o número do registro for maior que 1 (todos, exceto primeiro) e o segundo campo $2 corresponder ao padrão /.*\.app/

A saída:

DOM,PROJ,APP,USER,DATE,TIME,STATUS
www,test,biz.app,bob,6-1-18,09:33,OK   
www,INVALID,biz.app,tony,7-11-17,06:22,ok
    
por 25.06.2018 / 21:57
0

Usando a ferramenta GNU sed , podemos abordar esse problema da seguinte forma:

 sed -e '
    1!s/,/\n&/2
    /\.app\n/s/,/,INVALID,/
    s/\n//
 '  file.csv

Para ser lido como:

 ° Only for lines that are not the first, meaning, skip the header from being considered for processing, whilst for the others, place a marker at the second occurrence of the comma.
 ° Any line that has the 2nd field terminating in a .app append the string INVALID after the first field.
 ° Now take away the marker.
 ° N. B.  Lines whose 2nd field doesn't comprise *.app  are passed on unmodified.
    
por 26.06.2018 / 04:34