Подсчитать вхождение строки во входном файле - PullRequest
4 голосов
/ 23 января 2012

Существует сценарий оболочки, который должен обрабатывать входящий текстовый файл.

Этот текстовый файл содержит строки, разбитые на несколько строк, и каждая строка присутствует более одного раза.

Сценарию оболочки необходимо прочитать этот текстовый файл и вывести строку и количество каждой строки.

Рассмотрим текстовый файл:

Тим

Тим

Марка

МАРК

Аллен

ALLen

allEN

Вывод должен быть таким:

Тим появляется 2 раза

Отметитьпоявляется 2 раза

Аллен появляется 3 раза

Прямо сейчас я могу напечатать вхождение строк, но это повторяется количество раз, когда встречается строка, то есть "Тим появляется 2 раза "печатается дважды.Я пытался заменить строку на NULL, как только я посчитал ее возникновение, но по какой-то причине sed не работает, потому что, возможно, я не вызываю ее в нужном месте (или в правильном направлении)

 #!/bin/bash

INPUT_FILE="$1"
declare -a LIST_CHARS

if [ $# -ne 1 ]
then
        echo "Usage: $0 <file_name>"
        exit 1
fi


if [ ! -f $INPUT_FILE ]
then
        echo "$INPUT_FILE does not exists. Please specify correct file name"
        exit 2
fi

while read line
do
        while read i
        do
                echo $line
                count=`grep -i $line | wc -l`
                echo "String $line appears $count times"
        done < $INPUT_FILE

done < $INPUT_FILE

Ответы [ 4 ]

11 голосов
/ 23 января 2012

Вы также можете использовать sort и uniq с флагами, чтобы игнорировать регистр:

sort -f FILE | uniq -ic

Простая команда sed может изменить формат вывода на указанный:

s/^ *\([0-9]\+\) \(.*\)/\2 appears \1 times/
8 голосов
/ 23 января 2012

Классическое решение awk выглядит примерно так:

$ awk 'NF{ count[ toupper( $0 ) ]++} 
    END{ for ( name in count ) { print name " appears " count[ name ] " times" };
}' input
1 голос
/ 23 января 2012
for i in `sort filename |uniq -c``
do
    # --if to print data as u like--
done
1 голос
/ 23 января 2012

Предполагается, что data.txt содержит ваше слово. Следующий скрипт сделает.

while read line
do  
    uc=$(echo $line | tr [a-z] [A-Z] | tr -d ' ')
    echo  $uc $(grep -i "$uc" strs.txt | wc -l)
done< data.txt | sort | uniq

Выход.

31
ALLEN 6
MARK 4
MOKADDIM 1
SHIPLU 1
TIM 4

Другой вариант -

sort -f data.txt | uniq -i -c  | while read num word
do  
    echo $(echo $word|tr [a-z] [A-Z])  appeard  $num times
done

Примечание. Я вижу, что ваш текстовый файл содержит пустые строки. Таким образом, 31 в выводе содержит количество пустых строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...