我创建了一个shell脚本,它根据我在控制台中编写的输入文件过滤某些数据。但是现在我有大约30个要过滤的文件,我想知道我是否可以编写所有需要在.txt文件中过滤的文件(PATH)并在主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 :(得分: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
未对每个文件的每一行进行测试,因此效率更高一些):
$ awk -v list="data.txt" 'BEGIN{ while ( (getline line < list) > 0 ) { ARGV[ARGC]=line; ARGC++ } close(list) } {print FILENAME, $0}'
file1 foo
file2 bar
答案 1 :(得分:1)
是的,如果files.txt
包含您的文件列表,并且yourCommand.sh
是您接受文件作为参数的脚本,则可以执行
cat files.txt | xargs -L 1 yourCommand.sh
这将逐一提供files.txt
到yourCommand.sh
的每一行。它不使用awk
,但我认为它可以实现您想要的效果。
注意:我不在乎它是'无用的猫'
答案 2 :(得分:1)
awk可以获取多个输入文件并逐个进行处理。如果您希望将输出收集在同一个文件中,那么这是典型的awk用例。
例如,如果您将脚本作为
运行app:expanded
您可以扩展到多个文件
awk -f script.awk inputfile > outputfile
或者,如果使用标准命名
awk -f script.awk inputfile1 inputfile2 ... > outputfile
或者,您的所有文件都在目录
中awk -f script.awk inputfile{1..30} > outputile
等
如果每个输入文件需要一个输出,则需要在脚本中进行重定向。因为我们不知道你的脚本是什么,所以我将提出一个简单的案例。
例如,这会将索引为1到30的输入文件的标题(第一行)打印到相应的输出文件
awk -f script.awk inputfiles/* > outputile