Como classificar um arquivo separado por tabulação?

0

Estou tentando usar o sort para classificar um arquivo separado por tabulações como este:

Fruit       Color   Origin              Category
pear        green   Oviedo–Gijón–Avilés Oviedo–Gijón–Avilés
strawberry  red     Reggio Calabria     garden strawberry
apple       green   Oviedo–Gijón–Avilés Arkansas Black
banana      yellow  Makindye Ssabagabo  East African Highland bananas

por todas as colunas. Isto é o que eu acabei com ( <n> : número da coluna):

$ sort -t $'\t' -k <n>  <(tail -n+2 fruits.tsv)

que funciona para as duas primeiras colunas, mas não para a terceira e a quarta coluna. Por exemplo. para a quarta coluna eu recebo isto:

banana      yellow  Makindye Ssabagabo  East African Highland bananas
apple       green   Oviedo–Gijón–Avilés Arkansas Black
pear        green   Oviedo–Gijón–Avilés Oviedo–Gijón–Avilés
strawberry  red            Reggio Calabria      garden strawberry

o que está errado. Além disso, a quarta linha aparece deslocada no terminal. O que estou fazendo errado?

    
por coverflower 18.04.2018 / 19:08

2 respostas

3

Estes são seus dados com todas as guias convertidas para | :

pear||green|Oviedo–Gijón–Avilés|Oviedo–Gijón–Avilés
strawberry|red||Reggio Calabria||garden strawberry
apple||green|Oviedo–Gijón–Avilés|Arkansas Black
banana||yellow|Makindye Ssabagabo|East African Highland bananas

Como você pode ver, há lugares onde duas guias separam o que você acha que são colunas vizinhas; sort verá uma coluna com uma entrada em branco.

Solução: substitua várias guias por uma única guia antes de classificar.

tail -n+2 fruits.tsv | tr -s '\t' | sort -t $'\t' -k <n>

( fonte ).

Se você quiser que a saída seja legal, passe o resultado por column :

… | column -t -s $'\t'

(esse $'\t' será substituído pelo caractere de tabulação em bash ). No entanto, isso introduzirá espaços em vez de guias, de modo que o resultado final será praticamente impossível de ser analisado posteriormente. Use column somente ao apresentar para humanos.

Alguns pagers (como less ) também podem apresentar seus dados separados por tabulações de uma maneira mais agradável:

… | less -x 25
    
por 18.04.2018 / 19:31
0

Com um passo extra (Fonte: [ link ):

tr -s '\t' '\t' < fruits.tsv > fruits_single_tab.tsv

tail -n+2 fruits_single_tab.tsv | tr -s '\t' | sort -t $'\t' -k 4 | less -x 25

Eu posso ter várias guias no arquivo.

    
por 18.04.2018 / 20:28