2014-02-27 87 views
0

我的第一線多個CSV文件CSV - grep的特定模式,打印的第一場比賽,並且文件

> File 1 
name,age,city 
john,30,NY 
cassey,25,SF 
nick,25,DC 

> File 2 
attended,days 
math,30 
phy,25 
che,25 

> File 3 
days, weeks 
30, 4 
20, 5 

我要搜索一個條目,當我得到它,我想停止第一個入口。不過,我也想打印的文件的第一行,因爲它是一個CSV,它會幫我列

如果我尋找25名,我期望的輸出是

File 1: 
    name,age,city 
    cassey,25,SF 
File 2: 
    attended,days 
    phy,25 

用下面的代碼,我能夠打印

# grep -m 1 25 * -rn 
cassey,25,SF 
phy,25 

如何管grep的輸出sed的或其他實用程序,這樣我可以打印第一列和輸出匹配列。

回答

1

您可以使用sed而不是grep。使用lsxargs到理線許多文件:

ls file* | xargs -n1 sed -n '1{x;d}; /25/{x;p;x;p;q}' 

之所以要「X; P」是不打印的第一行,如果模式沒有在文件中找到。

file1的:

name,age,city 
cassey,25,SF 

file2的:

attended,days 
phy,25 
at,25 

file3的:

attended,days 
phy,26 

結果:

$ ls file* | xargs -n1 sed -n '1{x;d}; /25/{x;p;x;p;q}' 
name,age,city 
cassey,25,SF 
attended,days 
phy,25 

編輯:打印文件名 - 現在正確的bash循環:

$ for i in `grep -l 25 file*` ; do echo $i; head -n1 $i; grep -m1 25 $i; done 
file1 
    name,age,city 
    cassey,25,SF 
file2 
    attended,days 
    phy,25 
+0

謝謝,如何打印文件名以及.. – Joe

+0

現在,這有點難。在這種情況下,我會首先使用grep來查找模式是否在文件中,然後打印文件名,第一行和匹配行。所有這些都是一個帶有循環的普通bash腳本。請參閱編輯。 – aragaer

+0

謝謝..這個工程.. – Joe

4

您可以使用awk此:

$ awk 'NR==1{print} NR>1 && /25/ {print; exit}' file 
name,age,city 
cassey,25,SF 

也就是說,當NR(數紀錄,在這裏行的數量)爲1,打印。從那一刻開始,只要一行符合該模式,就打印並退出。


要檢查所有文件:

for file in * 
do 
    echo "$file" 
    awk 'NR==1{print} NR>1 && /25/ {print; exit}' $file 
done 

哪裏*可以像file*文件模式。在這種情況下,它將遍歷所有名稱以file開頭的文件。


要只打印匹配其這些文件的名稱,這樣做:

for file in * 
do 
    do grep -q 25 "$file" && echo "$file" && awk 'NR==1{print} NR>1 && /25/ {print; exit}' $file 
done 

grep -q返回true,如果有匹配。在這種情況下,它會繼續並打印文件名和行。

+0

謝謝..您的解決方案適用於我的第一個問題。我不是很清楚我的問題,所以我現在編輯了我的原始問題..我有多個文件,並且我希望搜索繼續..並且我還希望文件名稱也被打印出來。 – Joe

+0

如何在bash循環? '用於*中的文件;做echo $ file; awk ...; done'? – fedorqui

+0

這將打印所有文件名和所有文件的第一行。我只想打印文件名和匹配文件的第一行 – Joe