Imprimindo campos seletivos seguindo as instruções da primeira coluna

4

Suponha que eu tenha um arquivo no qual gostaria de imprimir simultaneamente diferentes comandos awk após as instuções da primeira coluna, sem bagunçar o arquivo original (como aconteceria com duas impressões separadas):

Arquivo:

End 1st 2nd 3rd
Fin 1st 2nd 3rd

Gostaria de combinar os seguintes comandos em uma linha:

awk '$1 ~ /^E/ {print $2}'
awk '$1 ~ /^F/ {print $3}'

Para obter a seguinte saída:

End 1st
Fin 2nd

EDITAR O que eu quis dizer com "bagunçar o arquivo original":

Arquivo 1:

E1   NAME1 LASTNAME1
FA   22   1992         #age, year
FC   UK   London       #country, city
FJ   IT   HP           #job, company
E2   NAME2 LASTNAME2
FA   25   1989        
FC   CH   Geneva      
FJ   CS   SIB    

Agora, se eu executar duas impressões do awk separadas, não poderei corresponder as informações no Arquivo 3 com os nomes do Arquivo 2 (especialmente se o número de campos ^F não for do mesmo número):

awk '$1 ~ /^E/ {print $2}' File 1 > File 2

Saída (Arquivo 2):

NAME1
NAME2

awk '$1 ~ /^F/ {print $3}' File 1 > File 3

Saída (Arquivo 3):

1992        
London       
HP           
1989        
Geneva      
SIB  

Mas, se eu me juntar a eles (como sugerido nas respostas), poderei ter algo assim:

Resultado esperado:

NAME1
1992        
London       
HP  
NAME2
1989        
Geneva      
SIB  
    
por dovah 25.07.2014 / 15:44

4 respostas

4
awk '$1 ~ /^E|^F/ {if ($1 == "End") print $1" "$2; if ($1 == "Fin") print $1" "$3}'

ou

awk '/^End/{print $1" "$2}/^Fin/{print $1" "$3}'

(graças a Jidder )

Deve funcionar.

    
por 25.07.2014 / 15:49
3

Isso deve funcionar

awk '/^F/{$2=$3}NF=(NF-2)' file

Se você quiser combinar E também (se houver outras coisas no arquivo)

awk 'a=/^F/{$2=$3}{x=/^E/}(x||a)&&NF=(NF-2)' file
    
por 25.07.2014 / 16:27
3

Tente:

awk '$1 ~ /^E/ {print $1,$2;next};$1 ~ /^F/ {print $1,$3}' file
    
por 25.07.2014 / 15:55
2

Para a saída esperada,

awk '/^E/{$0=$2} /^F/{$0=$3}1' file

Se você quiser imprimir o primeiro campo também,

awk '/^E/{$0=$1 FS $2} /^F/{$0=$1 FS $3}1' file
    
por 25.07.2014 / 18:28

Tags