Separe o arquivo de entrada em três colunas e classifique-o pela terceira coluna [closed]

0

Até agora eu tenho meu script (script.sh) como:

#!/bin/bash/

BEGIN {  
        print "Author    Name of Book     ISBN"  
        print "------    ------------     ----"  
}  
{ printf "%-9s &s\n", 1$, 2$, 3$ }  
END  

Então eu corro o comando:

sort -k 3,3 INPUTFILE.INPUT | awk -f script.sh  

Nada acima está funcionando conforme necessário.

Além disso, como nota, o arquivo de entrada possui dados separados por vírgulas. Eu também tenho que usar um "loop" que estou esperando que o comando awk esteja fazendo.

    
por T13 11.06.2018 / 03:32

1 resposta

1

Existem alguns problemas aqui, alguns que geram erros e outros que são apenas erros de digitação ou o resultado de mal-entendidos:

  1. A #! -line pode ser removida ou ele deve dizer

    #!/usr/bin/awk -f
    

    (ou qualquer que seja a localização de awk no seu sistema). Com o #! -line acima, você não precisa chamar o script com awk -f na linha de comando, mas pode usar ./script.awk diretamente, se for executável. Sem #! -line, você precisa usar awk -f na linha de comando.

  2. Para fazer referência ao valor em um determinado campo nos dados de entrada, use $n , em que n é o número do campo ao qual você está se referindo, não n$ .

  3. A string de formatação printf tem apenas um espaço reservado no formato, mas você está fornecendo três partes de dados. Também não há parênteses em torno de seus argumentos.

  4. O bloco END pode ser removido.

  5. Se a entrada tiver delimitadores de campo, como , ou | , em vez de serem delimitados em espaços em branco (espaços ou tabulações), você deverá informar awk sobre isso usando, por exemplo, awk -F ',' ou awk -F '|' , ou definindo a variável FS para o caractere apropriado no bloco BEGIN . Caso contrário, o script dividirá os registros de entrada incorretamente.

Isso nos deixa com o script ( script.awk ):

BEGIN {
    fmt = "%-15s\t%-15s\t%-15s\n"
    printf(fmt, "Author", "Name of Book", "ISBN")  
    printf(fmt, "------", "------------", "----")  
}

{ printf(fmt, $1, $2, $3) }

Tomei a liberdade de introduzir uma string de formato que formata cada um dos três campos delimitados por tabulação como uma string justificada à esquerda. Cada campo recebe 15 caracteres de espaço. Você pode facilmente ajustar isso alterando fmt no bloco BEGIN .

A invocação seria

sort -t ',' -k 3,3 INPUTFILE.INPUT | awk -F ',' -f script.awk

Aqui, é assumido que os dados no arquivo são separados por vírgulas (e o comando sort foi alterado de acordo).

    
por 11.06.2018 / 08:35