Como obter a palavra mais longa e a palavra mais frequente que começa com uma letra específica? [fechadas]

0

Dada uma lista de palavras e suas contagens assim:

2 you
1 polka
2 dress
3 are
4 world

Eu gostaria de escrever 2 comandos Bash que me darão:

  1. A palavra mais longa começando com a letra 'a'

  2. A palavra mais frequente que começa com 'a'.

Eu estava pensando em fazer isso com sed grep ^a , mas não sei como escrever o restante do comando canalizado.

    
por user2953423 20.11.2015 / 10:35

3 respostas

4

Para obter a palavra mais longa, podemos usar a função awk do length . Em seguida, classifique, em seguida, head e cut para obter a linha e o campo corretos.

awk '$2~/^a/ {print length($2), $2}' file | sort -k1 | head -1 | cut -d" " -f1

Para obter a palavra A mais frequente, use sort e awk :

sort -k1 file | awk '$2~/^a/ {print $2; exit}'

Na vida real, eu provavelmente evitaria muito as coisas. Eu provavelmente faria cada um em um único awk . Difícil dizer se eles realmente teriam um desempenho mais rápido. awk é flexível, mas não tão rápido.

awk 'BEGIN{lc=0;lw=""} $2~/^a/ {l=length($2); if (l>lc){lc=l;lw=$2}} END{print lw}' file
awk 'BEGIN{fc=0;fw=""} $2~/^a/ {if ($1>fc){fc=$1;fw=$2}} END{print fw}' file
    
por Oli 20.11.2015 / 10:47
1

Aqui está uma solução sem o requisito de usar um pipe usando o AWK:

awk '$2~/^a/{if(length($2)>length(x))x=$2}END{print x}' in
awk '$2~/^a/{if($1>x[0]){x[0]=$1;x[1]=$2}}END{print x[1]}' in

Usando o Perl:

perl -lane '$F[1]=~/^a/||next;if(length($F[1])>length($x)){$x=$F[1]};END{print($x)}' in
perl -lane '$F[1]=~/^a/||next;if($F[0]>$x[0]){$x[0]=$F[0];$x[1]=$F[1]};END{print($x[1])}' in
% cat in
2 you
1 polka 
2 dress
3 are
4 world
1 abcd
4 abc
% awk '$2~/^a/{if(length($2)>length(x))x=$2}END{print x}' in
abcd
% awk '$2~/^a/{if($1>x[0]){x[0]=$1;x[1]=$2}}END{print x[1]}' in
abc
% perl -lane '$F[1]=~/^a/||next;if(length($F[1])>length($x)){$x=$F[1]};END{print($x)}' in
abcd
% perl -lane '$F[1]=~/^a/||next;if($F[0]>$x[0]){$x[0]=$F[0];$x[1]=$F[1]};END{print($x[1])}' in
abc
    
por kos 20.11.2015 / 11:07
0

Supondo que o arquivo é foo :

  • A palavra mais longa com a

    % awk '$2 ~ /^a/ {print length($2),$2}' foo | sort | tail -n1
    3 are
    
  • A palavra mais frequente com a

    % awk '$2 ~ /^a/ {print $1,$2}' foo | sort | tail -n1
    3 are
    

Por outro lado, por que necessariamente tubos? É um requisito absurdo.

    
por A.B. 20.11.2015 / 10:49