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]+ //'
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?
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]+ //'
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)'
$ 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.
Tags grep text-processing awk sed sort