数据处理AWK

时间:2015-08-18 13:14:39

标签: awk

我创建了一个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个文件,我想自动化这一点。

感谢您的建议

3 个答案:

答案 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.txtyourCommand.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