awk e sistema e imprimir e anexar ao arquivo csv

0

Eu estou tentando acrescentar uma coluna a um arquivo csv com 13 colunas.
Estou executando o seguinte comando:

awk -F "," 'BEGIN{ OFS="," } {gsub(/"/, "", $1);$14=system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\"");print}' mycsv.csv > test  

O resultado é que, no final do campo 13, o seguinte é anexado ^M,1 (ou ^M,0 e o valor da nova coluna, que é suposto ser o $ 14, é adicionado a uma segunda linha.
Então o csv quebra.
Qual é o problema aqui?

Exemplo de entrada:

"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  

Resultado esperado:

"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now", 1485771295  

UPDATE:
Isso:

awk -F"," 'BEGIN{ OFS="," } {gsub(/"/, "", $1);system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\"")|getline $14; print}' mycsv.csv > test  

Não tem o 0 ou 1 do status de saída de system , mas tem a ^M e a nova linha ativadas e, portanto, os $ 14 são impressos em uma nova linha

UPDATE 2:

$ cat mycsv.csv 
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"    

Fazendo:

$ awk -F"," '{printf; printf ","; gsub(/"/, "", $1);system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\"")}' mycsv.csv > test  
Failed conversion of ''1/30/2017 11:14:55 AM'' using format ''%m/%d/%Y %H:%M:%S %p''  
date: illegal time format  
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...   
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]    

E arquivo de resultados:
Quando eu faço gato eu vejo:

$ cat test
,1485771295 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  
,148577129511:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"    

Quando abro com o vim, vejo um ^M após "Now"

UPDATE 3:
Algo estranho, não consigo imprimir a linha completa. O seguinte dá lixo:

$awk -F',' '{ printf $0 }' mycsv.csv   
","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now""  

Mas isso funciona (mas eu não quero a nova linha que a impressão adiciona):

$ awk -F',' '{ print $0; }' mycsv.csv   
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  
    
por Jim 01.02.2017 / 21:32

1 resposta

2

De awk(1) , lemos que

   system(cmd)
          executes cmd and returns its exit status

Portanto, o 0 é o status de saída retornado pelo resultado do comando do sistema (uma saída normal). Nesse caso, você provavelmente precisará imprimir as colunas existentes, uma vírgula e, em seguida, fazer a data para que o padrão seja colocado no lugar certo, como mostra um exemplo simplificado:

(echo a,b,c; echo e,f,g) \
| awk -F, '{printf "%s", $0;printf ",";system("echo more")}'

Acrescentar uma nova coluna com entrada da primeira coluna não é muito diferente: imprima os dados, anexe uma vírgula, altere $1 para o sistema subseqüente, faça a chamada do sistema.

$ cat input 
"1/30/2017 11:14:55 AM","I","M"
$ awk -F, '{printf "%s", $0;printf ",";gsub(/"/, "", $1);system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\"")}' input
"1/30/2017 11:14:55 AM","I","M",1485774895
    
por 01.02.2017 / 21:41

Tags