CSV - Grep特定模式,打印第一个匹配项以及该文件的第一行

时间:2014-02-27 09:38:13

标签: regex csv sed grep

我有多个CSV文件

> 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或其他实用程序,以便我可以在输出中打印第一列和匹配列。

2 个答案:

答案 0 :(得分: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。在这种情况下,它会继续并打印文件名和行。

答案 1 :(得分:1)

您可以使用sed代替grep。使用lsxargs处理多个文件:

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

所有&x; x; p'如果在文件中找不到模式,则不打印第一行。

文件1:

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