Como posso obter o awk para imprimir tanto as partidas quanto as não correspondências?

4
Basicamente, tudo que eu quero fazer é alterar saídas se a entrada corresponder a um filtro, mas a parte que está sendo alterada não é o que está sendo filtrado (ou eu usaria sed ). O problema até agora é que meu awk está apenas exibindo as linhas alteradas.

Exemplo rápido, coloque isso em test.txt:

orange beet pear cowmilk
apple pear berry cowmilk
orange melon cherry cowmilk

Se eu usar o código:

awk /orange/'{gsub(/cow/,"cow~"); print}' test.txt

Eu recebo:

orange beet pear cow~milk
orange melon cherry cow~milk

Quando eu preferiria receber:

orange beet pear cow~milk
apple pear berry cowmilk
orange melon cherry cow~milk

Eu vejo que você pode fazer || com o awk, mas eu não consegui descobrir como encaixar isso com o gsub acima.

Para apreciação do bônus, o que eu realmente gostaria de fazer é adicionar cor em vez de ~ , mas isso quebra totalmente, ou seja,

awk /orange/'{gsub(/cow/,"cow'\e[1;34m'"); print}' test.txt

me dá um erro sobre \ não ser o fim da linha.

    
por Ken Oh 29.06.2012 / 06:27

2 respostas

8

Para cor, você precisa especificar o caractere ESC real (não o formato de escape \e ). o valor é hex \x1B ou octal 3 . Os seguintes scripts colorem o traço - e imprimem todas as linhas de entrada

awk '/orange/{gsub(/cowmilk/,"cow\x1B[1;34m-\x1B[0mmilk")} {print}' "$file"

sed '/orange/{s/cowmilk/cow\x1B[1;34m-\x1B[0mmilk/g}' "$file"
    
por 29.06.2012 / 07:15
5

Para imprimir cada linha após modificar apenas algumas, adicione uma condição separada que sempre é avaliada como verdadeira, como ( 1 ):

awk '/orange/{gsub("cow", "cow~")} 1' "$file"

Você também pode ter {print} explicitamente:

awk '/orange/{gsub("cow", "cow~")} {print}' "$file"

Lembre-se de que cada instrução awk consiste em uma condição e uma cláusula de instrução:

condition {statements}

Mas cada um deles é opcional, se você não incluir {statements} , será usado {print} . Se você não incluir condition , será usado 1 .

    
por 29.06.2012 / 15:34

Tags