grep string без чего-либо окружающего - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть каталог с несколькими файлами, давайте назовем эти 1.txt, 2.txt и т. Д. Каждый файл состоит из 3 столбцов: ID, лат и lon.К сожалению, некоторые из идентификаторов также могут быть пронумерованы (например, 1346, 248, 67912 и т. Д.).Я пытаюсь подсчитать количество экземпляров идентификатора станции среди всех файлов (1.txt, 2.txt и т. Д.) На основе мастер-файла (masterfile.txt).Пока у меня есть:

while IFS='' read line || [[ -n "$line" ]]
do
cat * | grep -w -c $line >> counting_filename.txt
done < masterfile.txt

, который прекрасно работает.Однако, если lat и / или long содержат конкретный идентификатор, это также будет учитываться.Например, если я ищу идентификатор станции 4575, если есть лат '47 .4575 'или lon' -77.4575 ', они также будут идти к счету.Таким образом, есть два решения, о которых я не могу придумать:

1) Просто grep в первом столбце экземпляров, или

2) grep, НЕ включая ведущих '. '

Например:

1.txt
4575 39.4575 -77.51
5010 38.3498 -78.4575
LAMS 38.4444 -78.3126

2.txt
3124 39.1010 -79.4575
4575 39.4575 -77.5010
PAOQ 39.2222 -78.0032

Если бы я выполнил указанную выше команду, я бы получил счет 6 для 4575, 2 для 5010, 1 для LAMS, 1 для 3124 и1 для PAOQ.

Что необходимо: 2 для 4575, 1 для 5010, 1 для LAMS, 1 для 3124 и 1 для PAOQ.

Есть мысли?

1 Ответ

0 голосов
/ 29 сентября 2018

Вы используете неправильные инструменты - маленький, простой скрипт на awk будет гораздо более надежным, эффективным и переносимым, чем смесь циклов оболочки, чтения, grep и т. Д.

Не ясно, чтоmasterfile.txt для вашего примера выглядит так, как будто это все, что вам нужно:

$ awk '{cnt[$1]++} END{for (id in cnt) print id, cnt[id]}' 1.txt 2.txt
LAMS 1
PAOQ 1
3124 1
4575 2
5010 1

Если вам нужен masterfile.txt для перечисления определенного набора идентификаторов, а не просто для подсчета всех идентификаторов, как указано вышезатем вы можете сделать это тоже:

$ cat masterfile.txt
4575
3124
PAOQ
BLAH

$ awk 'NR==FNR{ids[$1];next} $1 in ids{cnt[$1]++} END{for (id in cnt) print id, cnt[id]}' masterfile.txt 1.txt 2.txt
PAOQ 1
3124 1
4575 2

$ awk 'NR==FNR{ids[$1];next} $1 in ids{cnt[$1]++} END{for (id in ids) print id, cnt[id]+0}' masterfile.txt 1.txt 2.txt
BLAH 0
PAOQ 1
3124 1
4575 2

Я добавил BLAH, чтобы показать различные варианты обработки идентификатора из masterfile.txt, который не отображается в других ваших файлах.

...