2016-04-19 3 views
-2

Я пытаюсь написать очень маленькую программу, которая проверит количество подстрок в большом текстовом файле. Все, что он сделает, это подсчитать первые 2000 строк текстового файла, найти любые подстроки «TTT», подсчитать их и установить переменную в эту сумму. Я немного новичок в оболочке, поэтому любая помощь будет удивительно оценена!Поиск количества строк в файле

#!/bin/bash 

$counter=(head -2000 [file name] | grep TTT | grep -o TTT | wc -l) 
echo $counter 
+2

Разве это не работает? Вы действительно не задавали вопрос. –

+0

Он дает синтаксическую ошибку, Извините, если это было не ясно – Frost

+0

Вы должны использовать 'counter =' вместо '$ counter ='. Кстати, первый «grep TTT» можно пропустить. –

ответ

0

Для чего это стоит вам может awk лучше подходит для этой задачи:

awk -F"ttt" '{j=(NF-1)+j}END{print j}' filename 

Это поделит каждую запись в файле с помощью разделителей «ТТТ». Затем он подсчитывает количество полей, вычитает один и добавляет это к сумме.

Файл вроде:

ttt tttttt something 
1 5 ttt 
tt 
one more ttt record 

бы разделить (визуализируя с трубой DELIM), как:

| || something 
1 5 | 
tt 
one more | record 

Подсчет количества полей в записи:

4 
2 
1 
2 

Вычитая один от этого:

3 
1 
0 
1 

Количества до 5, то есть количество подстрок «ttt».

Чтобы включить это в скрипт (и фиксации ваш другой вопрос):

#!/bin/bash 

counter=$(awk -F"ttt" '{j=(NF-1)+j}END{print j}' filename) 
echo $counter 

Изменение в том, что, когда мы устанавливаем переменную в Bash мы не включаем в знак $ на фронте. Только при ссылке на переменную мы включаем $.

+1

как насчет того, чтобы сделать еще один шаг? 'awk -v RS =" ttt "'END {print NR-1}' file' – karakfa

+0

Это очень приятно! – JNevill

0

У вас есть некоторые незначительные ошибки синтаксиса там, вероятно, вы имели в виду это:

counter=$(head -2000 [file name] | grep TTT | grep -o TTT | wc -l) 
echo $counter 

Обратите внимание на малейшие изменения, которые я сделал там, чтобы заставить ее работать.

Btw grep TTT в середине избыточен, вы можете просто удалить его, то есть:

counter=$(head -2000 [file name] | grep -o TTT | wc -l) 
0

Grep уже может делать то, что вы хотите: counter=$(grep -c TTT $infile). Вы можете ограничить количество обращений (не строк) с помощью -m NUM, --max-count=NUM, что делает остановку grep в конце файла ИЛИ когда найдены NUM вхождения.

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