scripting awk para escanear arquivos para determinadas palavras e criar saída

2

Eu tenho muitas linhas como:

uid: jdoes mail:  [email protected]
mail:  [email protected] uid: mdoes
uid: kdoes mail:  [email protected]
mail:  [email protected] uid: tdoes

Como reorganizá-los para que pareçam:

uid: jdoes mail:  [email protected]
uid: mdoes mail:  [email protected]
uid: kdoes mail:  [email protected]
uid: tdoes mail:  [email protected]
    
por tester787 20.08.2016 / 01:12

2 respostas

3

O backbone do AWK é fazer algo para uma linha que corresponda a algo. Você tem dois tipos de linhas, portanto, correspondem a cada uma e são impressas de maneira diferente para cada uma. Uma maneira de fazer isso é:

awk '/^uid/ { print } /^mail/ { print $3" "$4" "$1"  "$2 }' <your files>

Como funciona:

  • Para as linhas que começam com uid , ele as imprime à medida que aparecem;
  • para linhas que começam com mail , organiza as colunas de maneira diferente (observe o espaço extra entre $1 e $2 , pois está lá nas uid linhas).

(Este é útil se você tiver outras linhas no arquivo.)

Outra maneira:

awk '/^mail/{$0=$3" "$4" "$1" "$2};1' <your files>

Como funciona:

  • print imprime $0 (a linha completa) por padrão;
  • ;1 é equivalente a ; { print } ;
  • alteramos $0 para linhas que correspondem a ^mail .

(Este provavelmente é mais rápido se você quiser processar e imprimir todas as linhas no arquivo . Obrigado don_crissti.)

    
por 20.08.2016 / 02:48
3

A tarefa pode ser fácil com sed

sed 's/^\(mail:\s*\S*\)\s*\(.*\)/ /' file.lines

Para ser POSIX, você deve alterar \s para [[:blank:]] e \S para [^[:blank:]] ou

sed 's/^\(mail:[^:]*\)[[:blank:]]\(.*\)/ /' file.lines
    
por 20.08.2016 / 09:33