在父目录中,我有几个子目录,每个子目录都包含一个或多个以空格分隔的文本文件。
我有以下命令可以输出我想要的内容,但仅限于单个文件INPUTFILE.txt
awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' INPUTFILE.txt
考虑到我有数千个子目录,并且文件名会有所不同,我如何将此命令应用于所有子目录;从父目录?
答案1
首先,cd
到您想要的父目录。
然后,使用 来find
运行awk
命令:
find -type f -exec awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' {} +
解释
- 默认情况下它已经是递归的,因此它将对所有子目录执行此操作
-type f
将限制查找f
iles ,而不是文件和目录- 该
-exec somecommand {} +
语法运行一个命令,并将找到的文件路径放在您编写的位置{}
- 据说该
+
选项更有效,因为它只运行一个实例,awk
同时将查找结果作为参数放入{}
,而另一种运行它的方式(此处未显示)将为每个文件名运行 awk 一次,据说更少高效的
答案2
好的,快速但肮脏的方法是使用循环,但我们需要先设置一些东西。下面将为您提供一个文本文件,其中包含您希望运行 awk 命令的文件的名称和路径。您需要从父目录运行它。
find . -type f -print >> source.txt
然后你运行循环
for i in $(cat source.txt); do
awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' $i >> OUTPUTFILE.txt
done
目前尚不清楚您是否需要单个输出文件,或者是否需要多个输出文件。
如果你想要多个输出文件,你可以这样做:
for i in $(cat source.txt); do
awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' $i >> $i.processed.txt
done
答案3
更新: 答案写完后问题就变了……
for a in */INPUTFILE.txt
do
cp "$a" "$a.bak"
YOUR-AWK "$a.bak" > "$a"
done
新问题看起来很奇怪!如果我理解正确的话
YOUR-AWK */*.txt > output.txt