Estou tentando entender este código:
awk 'NR%2{printf "%s ",$0;next;}1' yourFile
Agora eu tento personalizá-lo.
Dado este conteúdo error.txt:
KEY 4048:1736 string
3
KEY 0:1772 string
1
KEY 4192:1349 string
1
KEY 7329:2407 string
2
KEY 0:1774 string
1
Então:
awk 'NR%2{printf NR "%s ", $0; next}1' error.txt
... retornará:
1KEY 4048:1736 string 3
3KEY 0:1772 string 1
5KEY 4192:1349 string 1
7KEY 7329:2407 string 2
9KEY 0:1774 string 1
Eu acho que NR%2
se refere a números de linha pares, mas não tenho certeza a que 1
se refere.
Sem 1
, awk 'NR%2{printf NR "%s ", $0; next}' error.txt
retornará uma linha.
1KEY 4048:1736 string 3KEY 0:1772 string 5KEY 4192:1349 string 7KEY 7329:2407 string 9KEY 0:1774 string
No geral, ainda não estou conseguindo.
Dei uma olhada nessas páginas até agora:
que
%
é o operador aritmético Módulo/Restante , que encontra a divisão do módulo de dois ou mais números. oNR
in awk representa o número do registro atual que sua divisão por 2 onde está escrito como uma declaração de condição , que resulta em 0 para números de registros pares e, portanto, 0 é um resultado falso, portanto, a ação seguida não é executada e;no
1
final, será executado um idioma conhecido como condição sempre verdadeira que imprime os números de linha pares no final das linhas anteriores (executa sempre que oNR%2
resultado 0) onde aqueles são impressosprintf
sem quebra de linha. veja Qual é o significado de '1' no final de um script awkencontrou uma solução muito melhor que funciona em todos os aspectos:
Como por padrão o awk's
ORS
é sempre pré-preenchido com um single\n
, esse método sempre garante a junção de linhas pares com a logo acima, sem perder tempo fazendoNR % 2
quando tudo o que é necessário é testar se o ORS é uma string vazia ou não.===========postagem antiga abaixo================================
você pode trazer o condicional para dentro sem todas as próximas coisas:
Em linhas de números ímpares, o valor
NR%2
é 1 (verdadeiro),so 23^1+9 = 32 = ascii space.
Para linhas de números pares, obtém um 0/falso,
so 23^0+9 = 1+9 = 10 = ascii new line \n