Existem alguns problemas aqui, alguns que geram erros e outros que são apenas erros de digitação ou o resultado de mal-entendidos:
-
A
#!-line pode ser removida ou ele deve dizer#!/usr/bin/awk -f(ou qualquer que seja a localização de
awkno seu sistema). Com o#!-line acima, você não precisa chamar o script comawk -fna linha de comando, mas pode usar./script.awkdiretamente, se for executável. Sem#!-line, você precisa usarawk -fna linha de comando. -
Para fazer referência ao valor em um determinado campo nos dados de entrada, use
$n, em quené o número do campo ao qual você está se referindo, nãon$. -
A string de formatação
printftem 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. -
O bloco
ENDpode ser removido. -
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á informarawksobre isso usando, por exemplo,awk -F ','ouawk -F '|', ou definindo a variávelFSpara o caractere apropriado no blocoBEGIN. 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).