2017-06-14 176 views
1

我首先应该感谢大家对本网站上的所有答案。我花了很多时间阅读他们,但还没有发现任何符合我的问题。因此,我自己的职位。在文件夹上使用awk并将文件名添加到输出行中

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

grep -r GENE . > GENE.txt 

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

所以我尝试使用awk。我写的是这样的:(?现在我可以指定字符串必须是在一个特定的列,这我不能使用grep做,右)

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

这种运作良好。 然而,与grep相比,它在每行开头写入文件名,现在我不能直接看到哪个文件在我的输出文件中的哪一行来自哪个文件(大多数情况下会破坏搜索点)。这样,在每行的某处添加原始文件的名称似乎是绝对可行的,但我无法弄清楚。

我在搜索范围内搜索的文件(或更确切地说是更多),但否则我的搜索将始终是在同一个大文件夹的第7列中的某些特定字符串。我怎样才能得到这个工作?

谢谢你在前进, 伊丽莎白·ê

+0

*在每行的某个位置添加源文件的名称* - 不清楚 – RomanPerekhrest

+0

那么,如果您知道如何定义一个列,例如,您可以使'grep'只搜索某个特定列。 'seq 10 | tr'\ n'''| grep -E'^([^] +){6} 7''。 –

回答

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 
+0

@karakfa谢谢,忘了改变它!这是一个错字,我在sample.csv中只有一列,我添加了数值列以使我的帖子清晰 – haifzhan

0

听起来你正在寻找:

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

如果没有,那么编辑您的问题与样本输入和期望输出澄清。

相关问题