Нахождение самого длинного слова в текстовом файле - PullRequest
15 голосов
/ 22 января 2012

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

for i in `cat so.txt` do

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

Ответы [ 8 ]

21 голосов
/ 31 января 2013

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

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

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

13 голосов
/ 22 января 2012

Как правило, вы хотите использовать цикл 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"
5 голосов
/ 22 января 2012

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

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 голосов
/ 22 января 2012
longest=""
for word in $(cat so.txt); do
    if [ ${#word} -gt ${#longest} ]; then
        longest=$word
    fi
done

echo $longest
3 голосов
/ 22 января 2012

awk скрипт:

#!/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;
}

Текстовый файл:

[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
0 голосов
/ 07 июля 2019

'Модифицированный POSIX версия оболочки jimis ' xargs на основе ответа ;все еще очень медленный, занимает две или три минуты:

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

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

0 голосов
/ 23 июля 2013

Медленно из-за миллиарда вилок, но чистой оболочки, не требует 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 процессоров, предоставив xargs -P4.

0 голосов
/ 22 января 2012
for i in $(cat so.txt); do echo ${#i}; done | paste - so.txt | sort -n | tail -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...