determinando o número da coluna usando string no awk

5

Suponha que eu tenha um arquivo separado por pipe como:

|Sr|Fruits|Colors|
|1 |apple |red|
|2 |orange |orange
|3 |grapes |purple|

Aqui fica evidente que usando awk , $2 é Frutas e $3 é a coluna de cores.

No futuro, se a ordem das colunas mudar, é possível determinar o número da coluna usando a string?

Ou seja, Cores é $3 e Frutas é $2 ?

    
por abhishek nair 30.05.2015 / 18:29

4 respostas

4

Você pode tentar:

$ awk -F'|' '
{
  for(i=1;i<=NF;i++) {
    if($i == "Fruits")
      printf("Column %d is Fruits\n", i-1)
    if($i == "Colors")
      printf("Column %d is Colors\n", i-1)
  }
  exit 0
}
' file
Column 2 is Fruits
Column 3 is Colors

Uma observação de que a coluna real para Frutas e Cores são $3 e $4 .

    
por 30.05.2015 / 18:46
3

Talvez seja melhor imprimir todas as colunas presentes na primeira linha, para verificar não apenas esses dois campos, mas também detectar novas colunas, seus nomes, alterações de pedidos, etc.

awk -F'|' ' { for (i = 1; i <= NF; ++i) print i, $i; exit } ' file

saída:

1
2 Sr
3 Fruits
4 Colors
5
    
por 30.05.2015 / 21:23
3

Parece um pouco desajeitado, mas eu sempre encontro os números das colunas usando a seguinte linha de código:

head -1 file | sed 's/*delimiter*/\n/g' | nl

Aqui eu pego a linha de cabeçalho do arquivo e canso-lo para sed substituindo o delimitador com \ n. O resultado é que cada cabeçalho de coluna está agora em uma nova linha. Finalmente eu canalizo isto para nl que adiciona números de linha que correspondem aos números de coluna originais.

    
por 18.08.2016 / 22:06
2

Listar todos os cabeçalhos das colunas:

awk 'BEGIN{ FS="|" }
     { for(fn=1;fn<=NF;fn++) {print fn" = "$fn;}; exit; }
    ' file

Saída:

$1 = 
$2 = Sr
$3 = Fruits
$4 = Colors
$5 = 

Usando o texto da etiqueta, imprima as cores de sua escolha, na ordem que você escolher:

awk 'BEGIN{ FS="|" }
     NR==1 { split(columns, c) 
             for(fn=1;fn<=NF;fn++) hdr[$fn]=fn; next; }
     { printf( FS ); for (text in c) printf( "%s", $hdr[c[text]]FS ); print "" }
    ' columns="Colors|Fruits" file

Saída:

|red|apple |
|orange|orange |
|purple|grapes |
    
por 30.05.2015 / 23:12

Tags