2017-02-16 58 views
0

我有一堆來自公司的數據,我需要數一下,比方說,有多少人來自某個城市。最初我是用手工做的如何使用grep -c來統計文件中各種字符串的出現次數?

grep -c 'Chicago' file.csv 

但是現在我必須尋找很多城市,每次手動完成這項工作都很耗時。所以,我做了一些安全研究,發現這個:

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

但它doenst工作。它不斷給我0作爲輸出,我不知道什麼是錯的。無論如何,基本上我需要的是輸出每個結果(只是值)由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 

其中ñ是城市的列數(我認爲它的結構,因爲它的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 
$ 
相關問題