Selecione / extraia colunas com base nos valores de uma determinada linha

0

Aqui está um arquivo de texto de exemplo:

A B C D E F G
1 2 3 4 5 6 7
2 3 4 5 6 7 8
3 4 5 6 7 8 9

Gostaria de extrair colunas específicas com base nos valores da terceira linha, ou seja, 2 3 4 5 6 7 8. Digamos que eu gostaria de extrair todas as colunas com um valor na terceira linha maior que 5. Essas serão as 3 colunas finais. Por isso, meu objetivo é selecionar e gerar o seguinte:

E F G
5 6 7
6 7 8
7 8 9

Aqui está o meu código:

NR==3 {
    for (i=1; i<=NF; i++) {
        if ($i > 5)   x[j++] = i
    }
}
NR>= 1 {
  for (i=0 ;  i < j-1; i++ )
     printf("%s ",$x[i])
  printf("%s\n",$x[j-1])
}

No entanto, isso gera o seguinte:

A B C D E F G
1 2 3 4 5 6 7
6 7 8
7 8 9

O que eu senti falta?

    
por Aron 04.04.2013 / 17:31

3 respostas

1

Você poderia fazer:

code=$(
  awk '
    NR == 3 {
      for (i=1; i<=NF; i++)
        if ($i > 5) { printf "%s", sep "$" i; sep="," }
      exit sep == ""
    }' file
) &&
  awk "{print $code}" file

Isso é chamada awk duas vezes no mesmo arquivo. O primeiro lê a terceira linha para construir o código para a segunda invocação awk . Ele sai depois de processar a terceira linha, portanto, não lerá todo o arquivo completamente. Ele gera algo como $5,$6,$7 , então a próxima invocação de awk se torna:

awk '{print $5,$6,$7}' file
    
por 04.04.2013 / 21:34
0

Eu tenho outra solução para compartilhar:

cat > extract.columns.awk   
BEGIN {   
  infil=ARGV[1]  
    while (getline < infil > 0)  
      if (++n==3)  
      {  
        for(i=1;i<=NF;i++)  
            if ($(i) > 5) x[++j]=i  
    }  
close(infil)    
}  
{  
    for (i=1;i<j;i++)  
    printf("%s ",$x[i])  
    printf("%s\n",$x[j])  
}  

arquivo awk -f extract.columns.awk

    
por 05.04.2013 / 16:48
0

Por favor, certifique-se de mencionar o nome do arquivo duas vezes mencionado no código abaixo

awk 'NR == FNR{if(FNR == line) {for(i=1; i<=NF; i++) {if($i > lmt) a[i]} close(FILENAME)} next}
{for(i=1; i<=NF; i++) {for(i in a) {out = (out == "") ? $i : (out FS $i)}}
  print out; out=""}' line=3 lmt=5 file file
    
por 20.08.2014 / 17:08

Tags