Подтвердить что ты не робот

Поиск самого длинного слова в текстовом файле

Я пытаюсь сделать простой script для нахождения наибольшего слова и его количества/длины в текстовом файле с помощью bash. Я знаю, когда я использую awk свой простой и прямой, но я хочу попробовать и использовать этот метод... скажу, что я знаю, если a=wmememememe, и если я хочу найти длину, я могу использовать echo {#a} свое слово, которое я бы сделал echo ${a}. Но я хочу применить его на этом ниже

for i in `cat so.txt` do

Где so.txt содержит слова, я надеюсь, что это имеет смысл.

4b9b3361

Ответ 1

Обычно вы хотите использовать цикл while read вместо for i in $(cat), но так как вы хотите, чтобы все слова были разделены, в этом случае это получилось бы ОК.

#!/bin/bash
longest=0
for word in $(<so.txt)
do
    len=${#word}
    if (( len > longest ))
    then
        longest=$len
        longword=$word
    fi
done
printf 'The longest word is %s and its length is %d.\n' "$longword" "$longest"

Ответ 2

bash один вкладыш.

cat YOUR_FILENAME | sed 's/ /\n/g' | sort | uniq | awk '{print length, $0}' | sort -nr | head
  • распечатать файл (через cat)
  • разделить слова (через sed)
  • удалить дубликаты (через sort | uniq)
  • префикс каждого слова с длиной (awk)
  • сортировать список по длине слова
  • напечатайте слова с наибольшей длиной.

да, это будет медленнее, чем некоторые из вышеперечисленных решений, но также не требует запоминания семантики bash для циклов.

Ответ 3

longest=""
for word in $(cat so.txt); do
    if [ ${#word} -gt ${#longest} ]; then
        longest=$word
    fi
done

echo $longest

Ответ 4

Другое решение:

for item in  $(cat "$infile"); do
  length[${#item}]=$item          # use word length as index
done
maxword=${length[@]: -1}          # select last array element

printf  "longest word '%s', length %d" ${maxword} ${#maxword}

Ответ 5

awk script:

#!/usr/bin/awk -f

# Initialize two variables
BEGIN {
  maxlength=0;
  maxword=0
} 

# Loop through each word on the line
{
  for(i=1;i<=NF;i++) 

  # Assign the maxlength variable if length of word found is greater. Also, assign
  # the word to maxword variable.
  if (length($i)>maxlength) 
  {
    maxlength=length($i); 
    maxword=$i;
  }
}

# Print out the maxword and the maxlength  
END {
  print maxword,maxlength;
}

Textfile:

[jaypal:~/Temp] cat textfile 
AWK utility is a data_extraction and reporting tool that uses a data-driven scripting language 
consisting of a set of actions to be taken against textual data (either in files or data streams) 
for the purpose of producing formatted reports. 
The language used by awk extensively uses the string datatype, 
associative arrays (that is, arrays indexed by key strings), and regular expressions.

Тест:

[jaypal:~/Temp] ./script.awk textfile 
data_extraction 15

Ответ 6

for i in $(cat so.txt); do echo ${#i}; done | paste - so.txt | sort -n | tail -1

Ответ 7

"Измененная версия оболочки jimis для xargs -based; все еще очень медленный, занимает две или три минуты:

tr "'" '_'  < /usr/share/dict/words |
xargs -P$(nproc) -n1 -i sh -c 'set -- {} ; echo ${#1} "$1"' | 
sort -n | tail | tr '_' "'"

Обратите внимание на xargs и конечный tr бит, чтобы обойти трудность GNU xargs с одинарными кавычками.

Ответ 8

Медленная из-за газиллиона вилок, но чистая оболочка, не требует awk или специальных функций bash:

$ cat /usr/share/dict/words | \
    xargs -n1 -i sh -c 'echo `echo -n {} | wc -c` {}' | sort -n | tail
23 Pseudolamellibranchiata
23 pseudolamellibranchiate
23 scientificogeographical
23 thymolsulphonephthalein
23 transubstantiationalist
24 formaldehydesulphoxylate
24 pathologicopsychological
24 scientificophilosophical
24 tetraiodophenolphthalein
24 thyroparathyroidectomize

Вы можете легко распараллелить, например. до 4 процессоров, предоставив -P4 для xargs.