数据处理AWK

数据处理AWK,awk,Awk,我创建了一个shell脚本,它根据我在控制台中编写的输入文件过滤某些数据。但是现在我有大约30个文件需要过滤,我想知道我是否可以将所有需要过滤的文件(路径)写入一个.txt文件中,并在主awk文件中调用它来过滤其中的每一个文件,而无需在控制台中逐个键入 问候 awk-f“filter.awk”data.txt data.txt应具有以下文件名: prueba1.tr prueb2.tr . . prueba30.tr awk中的过滤器应该读取data.txt中的每个文件。如果存在匹配项,则继续打

我创建了一个shell脚本,它根据我在控制台中编写的输入文件过滤某些数据。但是现在我有大约30个文件需要过滤,我想知道我是否可以将所有需要过滤的文件(路径)写入一个.txt文件中,并在主awk文件中调用它来过滤其中的每一个文件,而无需在控制台中逐个键入

问候

awk-f“filter.awk”data.txt

data.txt应具有以下文件名: prueba1.tr prueb2.tr . . prueba30.tr

awk中的过滤器应该读取data.txt中的每个文件。如果存在匹配项,则继续打开文件并处理其中的数据。目前,我只是使用if(ARGV[1]=“name of the file.tr”){继续过滤过程},但我有大约30个文件,我想将其自动化一点


感谢您的建议

是的,如果
files.txt
有您的文件列表,并且
yourCommand.sh
是您接受文件作为参数的脚本,您可以这样做

cat files.txt | xargs -L 1 yourCommand.sh
这将把
files.txt
的每一行逐一输入到
yourCommand.sh
中。它没有使用
awk
,但我认为它实现了您想要的


注意:我不在乎这是“无用的cat用法”

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

cat files.txt | xargs -L 1 yourCommand.sh
这将把
files.txt
的每一行逐一输入到
yourCommand.sh
中。它没有使用
awk
,但我认为它实现了您想要的


注意:我不在乎这是“对cat的无用使用”

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
等等,

如果希望每个输入文件有一个输出,则需要在脚本中重定向。因为我们不知道你的剧本是什么,所以我将给出一个简单的案例

例如,这将把索引为1到30的输入文件的标题(第一行)打印到相应的输出文件中

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

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
等等,

如果希望每个输入文件有一个输出,则需要在脚本中重定向。因为我们不知道你的剧本是什么,所以我将给出一个简单的案例

例如,这将把索引为1到30的输入文件的标题(第一行)打印到相应的输出文件中

awk 'FNR==1{print > FILENAME".out"}' inputfiles{1..30}
或者,如果您愿意(效率更高一点,因为没有针对每个文件的每一行测试
NR==FNR
):

$awk-v list=“data.txt”'开始{while((getline line0){ARGV[ARGC]=line;ARGC++}关闭(list)}{打印文件名,$0}'
file1foo
文件2条
或者,如果您愿意(效率更高一点,因为没有针对每个文件的每一行测试
NR==FNR
):

$awk-v list=“data.txt”'开始{while((getline line0){ARGV[ARGC]=line;ARGC++}关闭(list)}{打印文件名,$0}'
file1foo
文件2条

是的,您可以。如果这不是你想要的答案,那么请编辑你的问题,以澄清你在问什么,并举例说明。你好@EdMorton,我该怎么做?我一直在尝试,但我总是得到一个空文件。正如我所说的,编辑你的问题以澄清你的问题,并提供示例输入和预期输出。是的,你可以。如果这不是你想要的答案,那么请编辑你的问题,以澄清你在问什么,并举例说明。你好@EdMorton,我该怎么做?我一直在尝试,但我总是得到一个空文件。正如我所说的,编辑您的问题以澄清您的问题,并提供示例输入和预期输出。hello@Shelleter。我试着按照你告诉我的去做,但是其他文件的所有信息,甚至来自它自己的信息都被记录在第一个输出文件中。我不知道这是否会对循环造成影响。对于多个输出文件,您必须修改脚本并在那里重定向。正如我试图在上面解释的,这只适用于单个输出文件。@karakfa:对不起,我没有注意到您需要每个列出的输入文件单独输出。因此,根据karakfa合理的答案,
awk'FNR==1{print>FILENAME.out“}'$(cat list.txt)
应该可以工作。这假定
list.txt
中包含的文件名中没有空格。祝大家好运!你好,谢尔特。我试着按照你告诉我的去做,但是其他文件的所有信息,甚至来自它自己的信息都被记录在第一个输出文件中。我不知道这是否会对循环造成影响。对于多个输出文件,您必须修改脚本并在那里重定向。正如我试图在上面解释的,这只适用于单个输出文件。@karakfa:对不起,我没有注意到您需要每个列出的输入文件单独输出。因此,根据karakfa合理的答案,
awk'FNR==1{print>FILENAME.out“}'$(cat list.txt)
应该可以工作。这假定
list.txt
中包含的文件名中没有空格。祝大家好运!