Saída inesperada do awk printf

3

Eu tenho o seguinte arquivo csv:

$ 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”,”N”  
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12”,”A”,”N”  
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12”,”A”,”N”  

Por que o seguinte não imprime todas as linhas?

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

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

Ambos devem imprimir todas as linhas, certo? O que estou fazendo errado?

    
por Jim 02.02.2017 / 11:28

1 resposta

10

O primeiro argumento para printf , seja C printf() ou printf utility ou awk 'co_de% é necessário 1 e é o formato .

Você quer:

awk '{printf "%s", $0}'

aqui. Se você não quiser um separador de registros de saída, também poderá fazer:

awk -v ORS= '{print}' < mycsv.csv

Ou até mesmo:

awk -v ORS= 1 < mycsv.csv

( printf() é a ação padrão, true é a condição padrão, mas você precisa especificar pelo menos uma ação ou condição, {print} é uma maneira de dizer true ).

Embora aqui, 1 seja suficiente:

tr -d '\n' < mycsv.csv

Ou se você ainda quiser um caractere de nova linha à direita para que a saída ainda seja texto:

paste -sd '
tr -d '\r\n' < mycsv.csv
' mycsv.csv

Também parece que o seu arquivo tem delimitadores de linha CRLF no estilo da Microsoft, portanto, convém também excluir os caracteres CR:

awk -v RS='\r\n' -v ORS= 1 < mycsv.csv

Ou apenas as sequências CRLF com tr implementações que suportam mais do que um único caractere awk (que inclui RS e gawk mas não o macOS mawk ):

awk -v RS='\r?\n' -n ORS= 1 < mycsv.csv

Ou:

awk '{printf "%s", $0}'

que está com o awk opcional para manipular os delimitadores de linha Unix ou MS-DOS.

Ou use itens como \r ou dos2unix para converter o arquivo para o formato Unix primeiro.

Notas

1 o argumento de formato para d2u é necessário em a especificação padrão da utilidade printf . Em awk e gawk , omitindo isso resulta em um erro. Em mawk busybox , é equivalente a awk e printf "" derivado da implementação original (como em awk ), é equivalente a macOS (de pouca utilidade, pois ainda é considerado um formato, você ainda receberá um erro se printf $0 contiver $0 caracteres).

    
por 02.02.2017 / 12:10

Tags