2015-08-18 49 views
0

我已经创建了一个shell脚本,它根据我在控制台中编写的输入文件过滤某些数据。但现在我大约有30个文件需要过滤,我想知道是否可以编写所有需要在.txt文件中过滤的文件(PATH),并在主awk文件中调用它来过滤每个文件在控制台中逐个打字。数据处理AWK

问候。

的awk -f “filter.awk” data.txt中

的data.txt应该有文件名称: prueba1.tr prueba2.tr 。 。 prueba30.tr

awk中的过滤器应该读取data.txt中的每个文件。如果匹配,则继续打开文件处理数据。现在要做到这一点,我只是使用if(ARGV [1] ==“file.tr的名称){继续过滤过程}但我有大约30个文件,我想自动化这一点。

感谢您的建议

+0

是的,你可以。如果那不是你想要的答案,那么请编辑你的问题,用例子说明你在问什么。 –

+0

你好@EdMorton,我怎么能这样做?我一直在尝试,但我总是得到一个空文件。 –

+1

正如我所说,编辑你的问题来澄清你所要求的并提供样本输入和预期输出。 –

回答

1

是啊,如果files.txt有你的文件列表,并yourCommand.sh是你的脚本,它接受一个文件作为参数,你可以做

cat files.txt | xargs -L 1 yourCommand.sh 

这将饲料中每行files.txtyourCommand.sh一个接一个。它不使用awk,但我认为它完成了你想要的。

注:我不关心它的一个“没用使用猫”

1

AWK可以采取多个输入文件并执行处理一个接一个。如果你想让输出收集在同一个文件中,这是一个典型的awk用例。

例如,如果您运行脚本作为

awk -f script.awk inputfile > outputfile 

您可以扩展到多个文件

awk -f script.awk inputfile1 inputfile2 ... > outputfile 

,或者,如果使用标准的命名

awk -f script.awk inputfile{1..30} > outputile 

,或者所有的文件在目录中

awk -f script.awk inputfiles/* > outputile 

等,

如果你想每输入一个文件输出,你需要在脚本重定向。既然我们不知道你的脚本是什么,我会提出一个简单的例子。

例如,这将打印到30索引1的输入的文件的报头(第一行)到相应的输出文件

awk 'FNR==1{print > FILENAME".out"}' inputfiles{1..30} 
+0

hello @shellter。我试图按你告诉我的方式去做,但其他文件的所有信息甚至从它自己都记录在第一个输出文件中。我不知道是否可能会发生这种情况。 –

+0

对于多个输出文件,您必须修改脚本并在其中进行重定向。正如我在上面解释的那样,这仅适用于单个输出文件。 – karakfa

+0

@karakfa:对不起,我错过了您需要每个列出的输入文件的单独输出。所以'awk'FNR == 1 {print> FILENAME“.out”}'$(cat list.txt)'应该可以工作,每个karakfa都有合理的答案。这假定'list.txt'中包含的文件名中没有空格。祝你们好运! – shellter

2
$ cat file1 
foo 
$ cat file2 
bar 
$ cat data.txt 
file1 
file2 

$ awk 'NR==FNR{ARGV[ARGC]=$0; ARGC++; next} {print FILENAME, $0}' data.txt 
file1 foo 
file2 bar 

或者如果你喜欢(多一点有效,因为NR==FNR ISN没有针对每个文件的每一行进行测试):

$ awk -v list="data.txt" 'BEGIN{ while ((getline line < list) > 0) { ARGV[ARGC]=line; ARGC++ } close(list) } {print FILENAME, $0}' 
file1 foo 
file2 bar