classifica um arquivo baseado no tamanho da coluna / linha

4

Eu preciso classificar um arquivo com base no número de caracteres na primeira coluna.

Eu não tenho ideia de como fazer isso. (No Linux, então sed / awk / sort está disponível).

Um exemplo:

.abs is bla bla 12
.abc is bla se 23 bla
.fe is bla bla bla
.jpg is pic extension
.se is for swedish domains

o que eu quero é classificar essas linhas, com base no comprimento da primeira coluna em cada linha. Algumas das linhas começam com 4 caracteres, alguns começam com 3 ou 2. Eu quero que o resultado seja algo como:

.fe is bla bla bla
.se is for swedish domains
.abs is bla bla 12
.abc is bla se 23 bla
.jpg is pic extension

Isso é possível?

    
por Gilles 31.01.2013 / 13:25

3 respostas

1

Você pode primeiro adicionar outra coluna com a contagem de caracteres com awk , do sort e depois adicionar a coluna adicionada:

awk '{printf "%d %s\n", length($1), $0}' file.txt | sort -n -k1,1 | sed -E -e 's/^[0-9]+ //'

    
por 31.01.2013 / 13:36
0

Você pode fazer com as ferramentas básicas do shell , mas se o Perl estiver disponível, você poderá expressar sua necessidade mais diretamente:

perl -l -e 'print sort {@a = split(/ /, $a, 2); @b = split(/ /, $b, 2);
                        length($a[0]) <=> length($b[0])} <>'

Com a transformação Schwartzian (mais eficiente para entradas grandes):

perl -l -e 'print map {$_->[0]}
                  sort {length($a->[1]) cmp length($b->[1])}
                  map {[$_, split(/ /, $_, 2)]} <>'

Se você tem Python, o código é mais detalhado, mas um pouco mais claro:

python -c 'import sys;
lines = sys.stdin.readlines();
lines.sort(key=lambda line: len(line.split()[0]));
sys.stdout.writelines(lines)'
    
por 31.01.2013 / 23:57
0
$ awk -vOFS='\t' '{ print length($1), $0 }' file.in | sort -k1,1n -k2,2 | cut -f2-
.fe is bla bla bla
.se is for swedish domains
.abc is bla se 23 bla
.abs is bla bla 12
.jpg is pic extension

Isso classifica o arquivo file.in pelo comprimento dos dados na primeira coluna, depois lexicograficamente nos dados reais da primeira coluna (isso não foi especificamente solicitado na pergunta, mas fornece um toque agradável ao resultado) .

O código awk criará uma saída delimitada por tabulação, como

4       .abs is bla bla 12
4       .abc is bla se 23 bla
3       .fe is bla bla bla
4       .jpg is pic extension
3       .se is for swedish domains

e é isso que sort ordena, na primeira coluna (numericamente) e depois na segunda coluna (lexicograficamente). O cut , em seguida, remove a primeira coluna desta.

    
por 21.09.2017 / 19:21