how does it get the number when the field is the number and letter?
Quando ,
é seu separador de campo ( -F,
), o texto como 2 a
é um campo único e é simplesmente tratado como o número 2 quando é usado como um número.
O idioma AWK é muito permissivo quando você pede que ele trate uma string como um número. Ele lê a string até o ponto em que ela deixa de fazer sentido como um número. Nesse ponto, se houvesse algo que fizesse sentido, esse é o seu número. Caso contrário, leva-lo como 0. Isso tudo acontece automaticamente quando você usa a string em uma expressão aritmética. Para ver como funciona, execute:
awk '{print $0 + 0}'
$0
é a linha inteira. Adicionar zero força-o a ser interpretado como um número, mas não altera o número que é. Então você pode digitar linhas de entrada para ver como awk
as trata como números. Você verá, por exemplo, que a cadeia vazia é 0, 3a
é 3, 1 2
é 1, 3.4.5.6
é 3.4 e assim por diante. (Pressione Ctrl + D no início de uma linha para sinalizar o fim da entrada e saia do awk
, ou simplesmente pressione Ctrl + C .
Dependendo do que você realmente quer fazer, você pode escrever um comando mais simples que seja mais claro sobre o que ele faz e como funciona e que pode ser modificado mais facilmente. Por exemplo , se cada arquivo tiver apenas duas colunas separadas por espaço em branco e as entradas não contiverem espaço em branco, basta mesclá-las em uma tabela de quatro colunas executando paste
sem -d
(ou , se preferir, com algo como -d ' '
) e processe a tabela canalizando-a para awk
sem -F
:
paste File1 File2 | awk '{print $1 - $3}'
Em seguida, torna-se óbvio como você adaptaria o script AWK quando os números aparecerem depois das letras, em vez de antes:
paste File3 File4 | awk '{print $2 - $4}'
(Para testar isso, você pode fazer File3
e File4
de File1
e File2
, respectivamente, usando awk
para alternar as colunas. Por exemplo, awk '{print $2, $1}' File1 > File3
torna File3
. )