2016-02-26 77 views
1

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

它可能是类似的东西?

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

那么你试过吗?问题是你没有使用'$ d'。你也可以使用'find'命令。 – cdarke

回答

0

如果你想保持你的for语句结构和应用awk脚本到每个指定文件,你可以做到以下几点:

for file in $(find words -type f -name ".*[12].txt"); do 
    awk -f script.awk "$file" 
done 

find命令对递归查看目录中的任何文件模式很有用。


编辑:如果你的文件名包含的东西,如空格,上面的脚本可能无法正确处理它们,所以你可以做以下代替:

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

或使用xargs的:

find words -type f -name ".*[12].txt" -print0 | xargs -0 awk -f script.awk 

这使您可以使用空\0字符分隔文件名,因此名称间距或其他特殊字符ters不会成为问题。 (你可以在这里找到更多的信息:Filenames with spaces breaking for loop, and find command,或在这里:Handling filenames with spaces,或在这里:loop through filenames returned by find)。

+0

不要为'$(whatever)中的文件做',因为各种文件名(如包含空格的文件名)失败。总是做任何|而IFS =读取-r文件'而不是甚至更好'无论| | xargs'。 –

+1

你是对的!我上面做了一个修改,以便按照您的建议提供替代方案。 – assefamaru

+0

@EdMorton:对于某些文件名,这些建议仍然存在问题。 (请注意,文件名甚至可以包含换行符。) – ruakh

1

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

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

我不知道。如果所有文件都在一次调用中传递,那么'script.awk'可能真诚地表现不同,而如果每个文件都是在单独调用中传递的。 – ruakh

+0

当然,还有其他一些考虑因素,但是OP没有给我们提供什么'script.awk'的功能,也没有提供任何示例输入或预期输出,或者甚至没有提供她的目录结构的具体表示 - 因此“根据你所说的我们到目前为止“ –

0

如果您需要跳过中间目录平,就看你可以用最大的子目录下/分钟深度

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

是的,管道后没有注意。固定。 – karakfa

相关问题