Cálculo do awk a partir de 2 arquivos canalizados colar -d

1

Os arquivos contêm: Arquivo1

1 a
2 b
3 c
...

------------------- Arquivo2

2 a
2 c
2 d
...

awk recebe este formato, separado por vírgula:

1 a,2 a
2 b,2 c
...

paste -d, File1 File2 | awk -F, '{n=NF/2;s=""; for (i=1;i<=n;i++){printf "%s%s", s, ($i-$(i+n));s=",";}; print ""}'

Eu uso esta linha para fazer a diferença linha por linha do primeiro campo; Primeira linha sendo 1-2 assim imprime -1

Ok, está tudo bem. Eu recebo a resposta certa, mas ainda não vejo como pode pegar o campo numérico quando o campo é separado por -F, representando

1 a

Se eu mudar

1 a 

para

a 1

fazendo o mesmo com o resto, não funciona, o que eu concordo na lógica. Então, em outras palavras, como se obtém o número quando o campo é o número e a letra? $ i = number, por que não carta também?

    
por Joe 21.10.2017 / 02:58

1 resposta

2

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 . )

    
por 21.10.2017 / 04:27

Tags