2017-02-16 13 views
0

У меня есть куча файлов с данными из компании, и мне нужно подсчитать, скажем, сколько людей из определенных городов есть. Первоначально я делал это вручную сКак использовать grep -c для подсчета вхождения различных строк в файл?

grep -c 'Chicago' file.csv 

Но теперь я должен искать много городов, и было бы много времени, чтобы сделать это вручную каждый раз. Так что я сделал несколько reaserch и нашел это:

#!/bin/sh 
for p in 'Chicago' 'Washington' 'New York'; do 
    grep -c '$p' 'file.csv' 
done 

Но это doenst работы. Он продолжает давать мне 0s как результат, и я не уверен, что не так. В любом случае, в основном то, что мне нужно, - это вывод с каждым результатом (только значения), заданным grep в столбце, поэтому я могу скопировать непосредственно в электронную таблицу. Пример:

132 
407 
523 

Заранее спасибо.

+2

переменные не расширены в одинарных кавычках. – Biffen

+0

Не знал, что это работает сейчас. Спасибо большое =) –

ответ

0

Из названия кажется, что вы хотите подсчитать количество вхождений строки, а не количество строк, на которых отображается строка, но так как вы принимаете ответ grep -c, я предполагаю, что вы действительно заботитесь о нем последний. Не используйте grep и читайте файл несколько раз. Граф все в один проход:

awk '/Chicago/ {c++} /Washington/ {w++} /New York/ {n++} 
    END { print c; print w; print n }' input-file 

Обратите внимание, что это будет печатать пустую строку вместо «0» для любой строки, которая не появляется, так что вы migt хотите инициализировать. Существует несколько способов сделать это. Мне нравится:

awk '/Chicago/ {c++} /Washington/ {w++} /New York/ {n++} 
     END { print c; print w; print n }' c=0 w=0 n=0 input-file 
+0

Я действительно не знал, что grep только подсчитал строки, в которых появилось это слово, но в моем случае он отлично работает. Его файл .csv, поэтому город входит в столбец города и появляется только один раз в строке. Спасибо за подсказку, это на самом деле довольно просто и полезно. Это будет иметь в виду в следующий раз. –

1

Вы должны использовать вид + Uniq для этого:

$ awk '{print $<N>}' file.csv | sort | uniq -c 

где N это номер столбца городов (я предполагаю, что это структурированная, так как это CSV файл).

Например, какая оболочка, как часто используются в моей системе:

$ awk -F: '{print $7}' /etc/passwd | sort | uniq -c 
    1 /bin/bash 
    1 /bin/sync 
    1 /bin/zsh 
    1 /sbin/halt 
41 /sbin/nologin 
    1 /sbin/shutdown 
$