extrai uma coluna de um arquivo de texto grande

3
    MaxVal  MinVal  AvgVal
    3.8959  0.795   2.249071429
    3.8416  0.7761  2.280848
    3.896   0.7949  2.221309804
    3.8727  0.7746  2.252477966
    3.8953  0.7957  2.225252

Suponha que eu queira extrair a coluna que tem o cabeçalho "AvgVal". Como posso fazer isso usando os comandos sed / grep . O arquivo atual tem mais de 1000 colunas.

    
por jyoti 01.04.2017 / 12:41

4 respostas

1

perl -pale '
   $. == 1 and ($idx) = grep { $F[$_] eq "AvgVal" } 0..$#F;
   $_ = $F[$idx];
' yourfile

Primeiramente, obtemos um bloqueio no número da coluna que estamos procurando imprimir, passando pelos campos do registro 1 e os usamos para imprimir os dados.

    
por 01.04.2017 / 12:59
1

Tente isso. Pesquisa a primeira linha do campo que você está querendo (AvgVal neste caso) e armazena o número da coluna na variável a. E então, para cada linha, defina $ 0 para a coluna desejada. Como o comportamento padrão é imprimir $ 0, isso atinge o objetivo.

$ awk 'NR==1{while($++a!="AvgVal");}{$0=$a}1' filename
AvgVal
2.249071429
2.280848
2.221309804
2.252477966
2.225252
$
    
por 01.04.2017 / 23:00
0

Outra abordagem usando o script de shell:

#!/bin/sh

filename=file.txt
search="AvgVal"

column_num='awk -F' ' '{ for (i = 1; i <= NF; ++i) print i, $i; exit } ' $filename | grep $search | awk '{ print $1 }''
awk -v x=$column_num '{ print $x }' $filename
    
por 01.04.2017 / 14:15
0

Com o AWK, isso varrerá todo o campo até encontrar o cabeçalho que você deseja e depois imprimirá a coluna encontrada:

$ a=$'MaxVal\tMinVal\tAvgVal\n3.8959\t0.795\t2.249071429\n3.8416\t0.7761\t2.280848'

$ echo "$a"
MaxVal  MinVal  AvgVal
3.8959  0.795   2.249071429
3.8416  0.7761  2.280848

$ awk 'NR==1{for (i=1;i<=NF;i++) if ($i=="AvgVal") {a=i;break}}{print $a}' <<<"$a"
AvgVal
2.249071429
2.280848
    
por 01.04.2017 / 19:07