在文件夹上使用awk并将文件名添加到输出行

时间:2017-06-14 20:48:55

标签: awk

首先,我要感谢大家为本网站的答案所做的所有工作。我花了很多时间阅读它们,但还没有发现任何适合我的问题。因此,我自己的帖子。

我有一个包含多个子文件夹和txt文件的文件夹。在这些文件的第7列中,有基因名称(我为生活做遗传学:))。这些是我想要提取的字符串。不久,我想在整个文件夹中搜索包含特定基因名称/字符串的任何文件中的任何行。我一直在使用grep,编写类似的东西:

grep -r GENE . > GENE.txt

很简单,但我需要能够进一步调整搜索,似乎awk是要走的路。

所以我尝试使用awk。我写了这样的话:

awk '$7 == "GENENAME"' FOLDER/* > GENENAME.txt 

这很好用(现在我可以指定字符串必须在特定的列中,这个我不能用grep做,对吧?)。 但是,与在每行开头写入文件名的grep相比,我现在无法直接查看输出文件中哪一行来自哪个文件(这主要取决于搜索点)。这个,将原始文件的名称添加到每一行的某个地方,似乎应该是绝对可行的,但我无法弄明白。

我正在搜索的文件发生变化(或者更多),但是否则我的搜索将始终是同一个大文件夹的第7列中的某些特定字符串。我怎样才能使这个工作?

提前谢谢你, Elisabet E

2 个答案:

答案 0 :(得分:3)

您可以使用FNR(FNR表示记录的文件编号)打印行号,并使用FILENAME打印文件名,然后从文件和哪行中获取匹配的行,实例:

sample.csv:

aaa 123
bbb 456
aaa 789

命令:

awk '$1 =="aaa"{print $0, FNR, FILENAME}' sample.csv

输出结果为:

aaa 123 1 sample.csv
aaa 789 3 sample.csv

答案 1 :(得分:0)

听起来像你在寻找:

awk '$7 == "GENENAME"{print FILENAME, $0}' FOLDER/*

如果没有,那么编辑你的问题以澄清样本输入和预期输出。