将命令应用于所有子目录/文件

将命令应用于所有子目录/文件

在父目录中,我有几个子目录,每个子目录都包含一个或多个以空格分隔的文本文件。

我有以下命令可以输出我想要的内容,但仅限于单个文件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将限制查找files ,而不是文件和目录
  • -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

相关内容