Digamos que eu tenha um arquivo de texto como:
R1 12 324 3453 36 457 4 7 8
R2 34 2342 2525 25 25 26 26 2 2
R3 23 2342 32 52 54 543 643 63
R4 25 234 2342 4 234242
Eu quero usar awk
para processar essas linhas de maneira diferente, como
awk '/R1/ { print "=>" $0} /R2/ { print "*" $0} '
e também quero imprimir o restante das linhas como estão (sem fazer duplicatas das linhas que já processei), basicamente preciso de uma /ELSE/ { print $0}
no final da minha awk
linha.
Existe uma coisa dessas?
awk
implementa os suspeitos usuais quando se trata de condicionais. É uma boa ideia usar noprintf
lugar doprint
trabalho que você deseja fazer na partida.fonte
if-then-else
disso.next
é uma ferramenta importante na programação do awk.printf
aqui. Sua única vantagem (a menos que você esteja fazendo uma formatação mais sofisticada que a concatenação) é que ela não adiciona uma nova linha, que não é relevante aqui.print
apenas tem que ser produzido,$0
enquanto queprintf
é necessário analisar uma sequência de formato.Chris Down já mostrou como você pode obter outra coisa para regexps usando uma declaração explícita 'if' em um bloco. Você também pode obter o mesmo efeito de outras maneiras, embora a solução dele seja provavelmente melhor.
Uma é escrever um terceiro regex que corresponda apenas ao texto não correspondido pelos outros, no seu caso, isso seria algo como isto:
Observe que isso usa regexps ancorados - o ^ no início dos regexps corresponde apenas ao início de uma linha - seus padrões originais não fizeram isso, o que diminui ligeiramente a correspondência, pois verifica todos os caracteres de uma linha em vez de pulando até a próxima linha. O terceiro caso ("else") corresponderá a uma linha que começa com um caractere que não é 'R' ([^ R]) ou que começa com um 'R' seguido por um caractere que não é um '1' ou ' 2 '(R [^ 12]). Os dois significados diferentes de ^ são um tanto confusos, mas esse erro foi cometido há muito tempo e não será alterado tão cedo.
Para usar regexps complementares, eles realmente precisam ser ancorados; caso contrário, o [^ R] corresponderia, por exemplo, ao 1 seguinte. Para regexps muito simples como você, essa abordagem pode ser útil, mas à medida que os regexps se tornam mais complexos, essa abordagem se torna incontrolável. Em vez disso, você pode usar variáveis de estado para cada linha, assim:
Isso define manipulado como zero para cada nova linha e, em seguida, como 1 se corresponder a um dos dois regexps e, finalmente, se ainda for zero, executa a impressão $ 0.
fonte
rfile
são apenas 10.000 linhas do conjunto de dados do questionador repetidas.if (!handled)
Que nojo! Usenext
para parar de considerar outras ações.if (!handled)
. Soluções gerais, flexíveis e reutilizáveis são boas. E se a próxima pessoa que tiver essa pergunta quiser fazer mais processamento após a impressão? As respostas comnext
não suportam isso.