File 在目录中的所有文件上运行,使用AWK分别处理每个文件
我想在目录中的每个文件上运行一个AWK脚本,但是AWK命令必须只在该文件中运行——也就是说,它在定义的RS之间搜索并返回它应该返回的内容,但是我需要它在到达一个文件的末尾时停止,并在下一个文件的开头再次开始 我正在运行此程序,它可以单独处理每个文件:File 在目录中的所有文件上运行,使用AWK分别处理每个文件,file,variables,search,awk,File,Variables,Search,Awk,我想在目录中的每个文件上运行一个AWK脚本,但是AWK命令必须只在该文件中运行——也就是说,它在定义的RS之间搜索并返回它应该返回的内容,但是我需要它在到达一个文件的末尾时停止,并在下一个文件的开头再次开始 我正在运行此程序,它可以单独处理每个文件: awk '!/value1|value2/ && NF {print FILENAME " - " RS,$1}' RS="value" file1 > result.txt 但是输出是不正确的,比如说,当使用 find .
awk '!/value1|value2/ && NF {print FILENAME " - " RS,$1}' RS="value" file1 > result.txt
但是输出是不正确的,比如说,当使用
find . -type f | awk ... file1 > result.txt
如何让它单独查看每个文件,但将结果附加到同一个文件中?不幸的是,我不知道。我想这是通过将每个文件添加到一个变量中,并让AWK查看它,但我不确定如何做到这一点
文件文件1:
文件2:
输出
我不确定当前目录的输出“接口版本”来自何处…:
for file in *
do awk ... "$file"
done > result.txt
如果需要递归到子目录中:
find . -type f -exec awk ... {} ; > result.txt
在这两种情况下,您可能应该将
result.txt
放在不同的目录中。否则,它将被匹配并用作输入文件。或者使用仅与所需文件匹配的通配符,而仅对当前目录不匹配result.txt
:
for file in *
do awk ... "$file"
done > result.txt
如果需要递归到子目录中:
find . -type f -exec awk ... {} ; > result.txt
在这两种情况下,您可能应该将
result.txt
放在不同的目录中。否则,它将被匹配并用作输入文件。或者使用只匹配所需文件的通配符,而不匹配result.txt
尝试此操作,给出两个已发布的输入文件:
$ gawk '
function prtName() {
if (name)
print FILENAME, name
name=""
}
/^interface/ { prtName(); name=$0 }
/^ (description|shutdown)/ { name="" }
ENDFILE { prtName() }
' file1 file2
file1 interface Vlan3990
这就是你要找的吗?请注意,它是特定于gawk的(由ENDFILE
提供),我认为这很好,因为您发布的示例命令也是特定于gawk的,但如果这是一个问题,只需添加FNR==1的测试,并将ENDFILE更改为END:
$ awk '
function prtName() {
if (name)
print filename, name
name=""
}
FNR==1 { prtName(); filename=FILENAME }
/^interface/ { prtName(); name=$0 }
/^ (description|shutdown)/ { name="" }
END { prtName() }
' file1 file2
file1 interface Vlan3990
请尝试此操作,因为您有两个已发布的输入文件:
$ gawk '
function prtName() {
if (name)
print FILENAME, name
name=""
}
/^interface/ { prtName(); name=$0 }
/^ (description|shutdown)/ { name="" }
ENDFILE { prtName() }
' file1 file2
file1 interface Vlan3990
这就是你要找的吗?请注意,它是特定于gawk的(由ENDFILE
提供),我认为这很好,因为您发布的示例命令也是特定于gawk的,但如果这是一个问题,只需添加FNR==1的测试,并将ENDFILE更改为END:
$ awk '
function prtName() {
if (name)
print filename, name
name=""
}
FNR==1 { prtName(); filename=FILENAME }
/^interface/ { prtName(); name=$0 }
/^ (description|shutdown)/ { name="" }
END { prtName() }
' file1 file2
file1 interface Vlan3990
shell脚本分别对每个文件调用awk?或者根据需要执行BEGIN/BEGINFILE/END/ENDFILE?是-因此它查看一个文件,运行命令,停止,然后打开目录中的下一个文件,运行命令,停止等等。。。不知道如何让它做到这一点,因为目录中有300多个文件。你能详细说明一下这个句子,但输出不正确吗?你得到的和你期望的有什么不同?在每个文件中都有最后一次出现的RS,因此,它在第一个文件中的最后一次出现和第二个文件的第一次出现之间进行查找和返回…当您似乎要求解决一个不存在的问题时,请澄清您试图对示例输入和预期输出执行的操作。shell脚本是否分别对每个文件调用awk?或者根据需要执行BEGIN/BEGINFILE/END/ENDFILE?是-因此它查看一个文件,运行命令,停止,然后打开目录中的下一个文件,运行命令,停止等等。。。不知道如何让它做到这一点,因为目录中有300多个文件。你能详细说明一下这个句子,但输出不正确吗?你得到的和你期望的有什么不同?在每个文件中都有最后一次出现的RS,因此,它在第一个文件中的最后一次出现和第二个文件的第一次出现之间进行查找和返回…澄清您试图对示例输入和预期输出执行的操作,因为您似乎要求解决一个不存在的问题。不需要该循环,awk完全可以在多个文件上运行。这会将所有文件连接到一个文件中,对吗?把每个文件都写到自己的文件里怎么样?就像一个sed-in-place?不需要那个循环,awk完全可以在多个文件上运行。这将所有文件连接到一个文件中,对吗?把每个文件都写到自己的文件里怎么样?像sed inplace?需要打印结果的文件名,但不确定如何在每行开头打印?脚本会在每行输出的开头打印文件名,请再看一看。我最初发布了一个没有打印文件名的脚本,所以在我编辑它之前你可能看到了。非常感谢ed。这正是我想要得到的。需要打印结果的文件名,不确定如何在每行开头打印?脚本在每行输出的开头打印文件名,再看一眼。我最初确实发布了一个没有打印文件名的脚本,所以在我编辑它之前你可能已经看到了。非常感谢ed。这正是我想要得到的。