2013-08-31 2 views
0

Я новичок в программировании и пытаюсь написать свой первый скрипт bash.Bash Script для сохранения результатов grep -c

У меня есть файл с именем NUMBERS.txt, который имеет различные номера в нем, как например:

1000 
1001 
1001 
1000 
1002 
1001 
etc.. 

Я хотел бы написать сценарий для подсчета возникновения каждого номера, сохранить его в качестве переменной и распечатать его в новый текстовый файл:

1001= 3 
1000= 2 
etc.. 

Я полностью застрял.

Вот что я до сих пор:

#!/bin/bash 

for Count in `grep -c '1000' /NUMBERS.txt ` 
do 
echo 'Count = '${Count} 
done 

for Count in `grep -c '1001' /NUMBERS.txt ` 
do 
echo 'Count = '${Count} 
done 
+0

ли это на самом деле нужно быть баш \ Grep? – Mansueli

+4

Лучший способ сделать это - sort NUMBERS.txt | uniq -c', плюс дополнительная пост-обработка для получения точного формата. Есть ли конкретная причина, по которой вы хотите «сохранить ее как переменную и распечатать ее»? – ruakh

+0

Я хочу сканировать весь NUMBERS.txt, подсчитывать уникальные числа, экспортировать счет под пользовательским именем в другой файл. – Novice

ответ

1

Теперь ваш файл уже есть один номер в каждой строке, это проще

for i in `sort -u NUMBERS.txt ` ; do count=`grep -c "$i" NUMBERS.txt ` ; echo "$i=$count" ; done > your_result.txt 

или в другом формате

for i in `sort -u NUMBERS.txt ` 
do 
    count=`grep -c "$i" NUMBERS.txt ` 
    echo "$i=$count" 
done > your_result.txt 

Как уже было сказано, производительность не очень хорошая. здесь намного лучше

sort NUMBERS.txt | uniq -c | awk '{print $1,"=",$2}' 

В основном вы проходите через NUNMBERS.txt дважды. На первом проходе вы получаете уникальные номера; Второй проход вы считаете появление каждого уникального номера.

+0

Это ужасно для производительности. Вам не нужно читать файл 1000 раз, как это делает решение. –

+0

Я предоставил лучший вариант –

4

Сортировка файла, то подсчитать, сколько раз встречается каждая уникальная строка:

sort NUMBERS.txt | uniq -c 
+2

Это действительно хороший ответ. Если вы примените вызов awk, вы получите следующее: 'sort NUMBERS.txt | uniq -c | awk '{print $ 2, "=", $ 1}' ', который печатает строки, такие как 1000 = 2 – Chris

+1

Это расширяемый способ сделать это. Не имеет значения, будут ли цифры увеличиваться на 9 цифр (или больше) или меньше 1000. И форматирование вывода тривиально обрабатывается (как указано в комментарии by @ twopoint718), если это необходимо. –

1

Я не лучший в сценарий оболочки, но вот решение, которое работает, используя Баш и Grep -c:

#!/bin/bash 

INPUT="./numbers.txt" 
OUTPUT="./result.txt" 

rm -f ${OUTPUT} 

# you might want to change the values 
for i in {1000..2000}; do 
    for Count in `grep -c ${i} ${INPUT}`; do 
    echo "${i} = ${Count}" >> ${OUTPUT} 
    done 
done 
+0

Какова точка команды rm -f $ {OUTPUT}? – Novice

+0

Поскольку я использую оператор '>>' для добавления каждой строки в файл, если вы не удалите ее перед запуском скрипта, вы будете иметь файл, содержащий результат дважды. В любом случае, ответ Джона Смита выглядит намного лучше, как я уже сказал, я не лучший в сценариях оболочки. – DCMaxxx

Смежные вопросы