我有多个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或其他实用程序,以便我可以在输出中打印第一列和匹配列。
答案 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。使用ls
和xargs
处理多个文件:
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