遍历子目录并针对某些文件执行awk脚本

时间:2016-02-26 16:21:12

标签: bash unix awk

我有一个名为../words的目录,其中包含许多子目录(words / blabla,words / blabla),每个子目录又包含两种类型的文件(。* 1.txt)和(。* 2。文本) 。我需要的是,针对这些文件中的每一个执行AWK脚本。

可能是这样吗?

for d in words/*
do
    for f in .*[0-9].txt
    do
    awk -f script.awk ${f}
    done
done

3 个答案:

答案 0 :(得分:2)

如果要保留...语句结构并将awk脚本应用于每个指定的文件,可以执行以下操作:

for

for file in $(find words -type f -name ".*[12].txt"); do awk -f script.awk "$file" done 命令对于递归浏览目录中的任何文件模式非常有用。

编辑:如果您的文件名包含空格等内容,则上述脚本可能无法正确处理,因此您可以执行以下操作:

find

或使用xargs:

find words -type f -name ".*[12].txt" -print0 | while read -d $'\0' file
do 
    awk -f script.awk "$file"
done

这允许您使用空find words -type f -name ".*[12].txt" -print0 | xargs -0 awk -f script.awk 个字符分隔文件名,因此名称间距或其他特殊字符的变化不会成为问题。 (您可以在此处找到更多信息:Filenames with spaces breaking for loop, and find command或此处:Handling filenames with spaces或此处:loop through filenames returned by find)。

答案 1 :(得分:1)

鉴于你到目前为止告诉我们的内容,这应该是你所需要的:

awk -f script.awk ../words/blabla/.*[12].txt

答案 2 :(得分:1)

如果您需要跳过中间目录级别,只需在子目录下查看,您可以使用最大/最小深度

$ find words -maxdepth 2 -mindepth 2 -type f -name '*[0-9].txt' | xargs awk -f ...