Como classificar o fluxo de dados por 2 nomes de colunas (o número da coluna pode variar)?

2

Eu recebo um fluxo de dados de uma API com a seguinte aparência:

redID  blueID  whiteID  
1      22       2  
44     15       41  
2      15       15  
31     2       14 

O que eu preciso fazer é classificar isso por blueID e, em seguida, whiteID e, em seguida, enviar para outro local. Mas eu não sei de antemão quantas colunas haverá. Tudo o que sei com certeza é que sempre haverá pelo menos essas duas colunas. Então a saída desejada ficaria assim:

redID  blueID  whiteID  
31     2       14  
2      15      15  
44     15      41  
1      22      2 

Existe uma maneira, talvez em awk , de classificar esse fluxo com base no nome de uma coluna?
A única resposta que estou procurando é em uma forma de:

inputStream | some operations | sortedInputStream

Alguma idéia?

    
por human 12.01.2016 / 17:12

2 respostas

0

Graças às ideias de comentários e outras fontes, finalmente consegui escrever este código e responder à minha própria pergunta:

   inputStream | awk -F'\t' -v OFS="\t" '{
            if ( col1 == ""){
                for (i=1;i<=NF;i++){
                    if ($i == "BlueId"){
                        col1=i;
                    }
                    else if ($i == "WhiteId"){
                        col2=i;
                    }
                }
            print "-1" "\t" "-1" "\t" $0
            }
            else {
                print $col1 "\t" $col2 "\t" $0
            }
        }' | sort -k1,1n -k2,2n | cut -f3- | outputStream

Funciona assim: ele pega dados de fluxo, localiza os números das colunas desejadas e imprime na frente de cada linha os dois valores necessários para classificar. Em seguida, ele classifica a 1ª e a 2ª coluna e as exclui. Obrigado!

    
por 13.01.2016 / 16:49
0

Você pode fazer algo como:

 # get the header line from the file and split each header to a different line
 header=$(head -1 $file_name | tr ' ' '\n')
 # get the index/line number of the blueID
 blueID_index=$(echo "$header" | grep -n "blueID" | sed 's/:.*//')
 # same for whiteID
 whiteID_index=$(echo "$header" | grep -n "whiteID" | sed 's/:.*//')
 # now build the sort command with the indexes you just computed
 sort -k$blueID_index -k$whileID_index
    
por 12.01.2016 / 17:27