Como substituir linha específica usando sed ou awk com base no comando run

5

Eu tenho um arquivo csv com esta aparência:

site1.com,aaa,bbb,ccc
site2.com,qqq
site3.com,rrr,uuu,ppp
site4.com
site5.com,ddd,sss

Eu quero substituir linhas (linhas) onde a quarta coluna está vazia.  e eu quero manipular as linhas, executando um comando sobre elas. Por exemplo, com awk :

awk -F, '$4=="" {system("$1,cmd1 $1")}' test.csv

Eu, então, quero exportar da seguinte maneira (output1 é resultado do comando cmd1):

site1.com,aaa,bbb,ccc
site2.com,output1
site3.com,rrr,uuu,ppp
site4.com,output1
site5.com,output1
    
por alrz 13.12.2016 / 08:59

5 respostas

1
awk -F, '{ if ( $4 == "" ){printf "%s,",$1 ; system(CMD) ;}else {print $0}}' test.csv

Se o quarto campo estiver vazio, imprima o primeiro campo com a saída do comando, ou imprima a linha do furo.

Mas esteja ciente da saída do comando como ele será impresso

    
por 13.12.2016 / 09:33
5
awk -F, -v q=\' '
  function shellquote(s) {
    gsub(q, q "\" q q, s)
    return q s q
  }
  $4 == "" {
    printf "%s,", $1
    system("cmd " shellquote($1))
    next
  }
  {print}'

A parte shellquote é importante. Considere o caso de um valor de $1 como ;reboot , por exemplo.

    
por 13.12.2016 / 09:36
1

Você pode usar o seguinte código:

awk -v output1="$(cmd1)" 'BEGIN{FS=OFS=","} NF&&NF<4{print $1,output1}1' file

A opção -v define a variável output1 como resultado do comando shell cmd1 .

A instrução BEGIN{FS=OFS=","} está definindo o delimitador para a vírgula.

Se a linha não estiver vazia e o número de campos for menor que 4, substitua a linha.

Por fim, o 1 aciona a instrução padrão em awk : imprime a linha inteira.

    
por 13.12.2016 / 09:17
0

pode ser que este post ajude você link

$ cat input.txt
a,b,c,d
a,b
a,b,c,d
a,b,c
a,b,c,d


$ awk -F, 'NF<4{cmd="echo output1";while(cmd|getline line){printf("%s,%s\n",$0,line)};close(cmd);next}1' input.txt
a,b,c,d
a,b,output1
a,b,c,d
a,b,c,output1
a,b,c,d
    
por 13.12.2016 / 09:21
0
sed -rn '
/\S+,\S+,\S+,\S+/{p;b}      # if all four columns exist, print and branch to end
s/^([^,]+).*//            # else extract first column
h                           # hold
s/.*/echo output &/e        # exeute external command echo with first column as argument
G                           # append previous hold value
s/(.*)\n(.*)/,/         # arrange position
p' file                     # print result
    
por 19.01.2017 / 14:04