Classificando bash com base no número de ocorrência de um caractere específico [closed]

-3

Eu preciso classificar um arquivo de texto com base no número de caracteres em uma linha e, em seguida, classificá-lo com base no menor número de caracteres em branco, ou seja, espaços, se o número de caracteres em duas linhas for o mesmo. Eu tenho a primeira parte, mas não consigo descobrir como fazer a segunda parte. Alguém pode me atirar um osso?

    
por Yang 08.05.2017 / 23:17

3 respostas

3

Eu usaria awk e algo assim:

awk -F " " '{print length($0), NF-1, $0}' file.txt

Se você tiver vários espaços, use este:

 awk '{NS=gsub(" "," ",$0); print length($0), NS, $0}' file.txt
  • gsub substitui cada espaço por um espaço e retorna a contagem desse processo, que é o número de espaços.

Digamos que recebemos um arquivo com este conteúdo:

here is something
here is something el s
here is something else
and agai n
and a a aa

o outpout do comando acima é:

17 2 here is something
22 4 here is something el s
22 3 here is something else
10 2 and agai n
10 3 and a a aa

A primeira coluna é o número de caracteres, o segundo é o número de espaços.

Em seguida, enviamos para sort e sort faremos o trabalho e, depois de tudo, posso usar o corte para obter apenas o conteúdo do arquivo original:

awk -F " " '{print length($0), NF-1, $0}' file.txt | sort -k1n,2 | cut -f3- -d' '

Para a segunda solução:

awk '{NS=gsub(" "," ",$0); print length($0), NS, $0}' file.txt | \
sort -k1n,2 | cut -f3- -d' '

E a saída final é:

and agai n
and a a aa
here is something
here is something else
here is something el s

Você pode alterar -F " " com seu caractere específico como "R":

awk -F "R" ...

ou

gsub("R","R",$0)

para o segundo.

    
por Ravexina 08.05.2017 / 23:29
1

Com base em Classificação avançada de Aprendizado de O'Reilly perl , você poderia fazer algo como

perl -lne '
  push @arr, $_ }{ 
  for $x (sort { length($a) <=> length($b) or $a =~ tr/ // <=> $b =~ tr/ // } @arr) {
      print $x
    }
' file

Pedindo @ amostra de entrada do ByteCommander ,

$ perl -lne '
>   push @arr, $_ }{ 
>   for $x (sort { length($a) <=> length($b) or $a =~ tr/ // <=> $b =~ tr/ // } @arr) {
>       print $x
>     }
> ' loremipsum.txt
Omnis et vitae et blanditiis in et.
Inventore eligendi distinctio perferendis ab.
Nostrum laboriosam et amet illum consectetur.
Molestiae ipsam quis dolores vero a delectus.
Voluptas quos doloribus totam porro inventore.
Aut cupiditate ullam possimus voluptate et delectus tenetur sint.

Se você tem o GNU awk 4.0 ou posterior, você pode fazer uma coisa semelhante - embora a função de classificação personalizada leve um pouco mais de trabalho, por exemplo

$ cat 2sort.awk 
#!/usr/bin/gawk -f

function mycmp(ia, a, ib, b) {
  n = length(a) - length(b);
  return n == 0 ? gsub(/ /,"",a) - gsub(/ /,"",b) : n 
}

{arr[NR] = $0}

END {
  PROCINFO["sorted_in"] = "mycmp";
  for(i in arr) print arr[i];
}

dando

$ ./2sort.awk loremipsum.txt 
Omnis et vitae et blanditiis in et.
Inventore eligendi distinctio perferendis ab.
Nostrum laboriosam et amet illum consectetur.
Molestiae ipsam quis dolores vero a delectus.
Voluptas quos doloribus totam porro inventore.
Aut cupiditate ullam possimus voluptate et delectus tenetur sint.
    
por steeldriver 09.05.2017 / 01:41
0

Aqui está um pequeno script Python que faz o trabalho. Observe que ele remove todos os caracteres de espaço em branco à direita de cada linha antes de classificar e na saída.

#!/usr/bin/env python3
import sys
if len(sys.argv) != 2:
    print("Error, you must specfy the input file name as only argument!")
    exit(1)
lines=[line.rstrip() for line in open(sys.argv[1])]
print(*sorted(sorted(lines, key=lambda b:b.count(" ")), key=lambda a:len(a)), 
      sep="\n")

Se você quiser encurtá-lo, deixe as linhas 3-5 fora, que apenas verificam se exatamente um argumento de linha de comando foi fornecido e imprima uma mensagem de erro se não for esse o caso.

E aqui está um teste:
(com o script salvo como sort.py e tornado executável usando chmod +x sort.py )

$ cat loremipsum.txt 
Nostrum laboriosam et amet illum consectetur.
Voluptas quos doloribus totam porro inventore.
Molestiae ipsam quis dolores vero a delectus.
Aut cupiditate ullam possimus voluptate et delectus tenetur sint.
Omnis et vitae et blanditiis in et.
Inventore eligendi distinctio perferendis ab.

$ ./sort.py loremipsum.txt 
Omnis et vitae et blanditiis in et.
Inventore eligendi distinctio perferendis ab.
Nostrum laboriosam et amet illum consectetur.
Molestiae ipsam quis dolores vero a delectus.
Voluptas quos doloribus totam porro inventore.
Aut cupiditate ullam possimus voluptate et delectus tenetur sint.
    
por Byte Commander 09.05.2017 / 00:23