Unix 搜索文件并对每个结果运行脚本

Unix 搜索文件并对每个结果运行脚本,unix,awk,find,xargs,Unix,Awk,Find,Xargs,我想知道如何在所有子目录(按月份/按日期-创建的子目录)中搜索特定模式的文件。然后,对找到的文件执行脚本 步骤1:例如:当前正在按此模式搜索文件TT_DETAIL*.gz find /cygdrive/c/Test/ -name TT_DETAIL*.gz 输出#1: 步骤2: zcat TT_DETAIL*.gz | awk 'BEGIN { FS=OFS=","} { if ($11=="10") print $2,$3,$6,$10,$11,$17}' >Op_TT_Detail

我想知道如何在所有子目录(按月份/按日期-创建的子目录)中搜索特定模式的文件。然后,对找到的文件执行脚本

步骤1:例如:当前正在按此模式搜索文件
TT_DETAIL*.gz

find /cygdrive/c/Test/  -name TT_DETAIL*.gz
输出#1:

步骤2:

zcat TT_DETAIL*.gz | awk 'BEGIN { FS=OFS=","} { if ($11=="10") print $2,$3,$6,$10,$11,$17}' >Op_TT_Detail.txt
cat Op_TT_Detail.txt

01-NOV-2014 00:30:53,AAA,ECH,1,10,XXX
01-NOV-2014 00:39:36,BBB,ECH,1,10,XXX
01-NOV-2014 00:39:44,CCC,ECH,1,10,XXX
01-NOV-2014 00:25:20,DDD,ECH,1,10,XXX
已尝试像这样组合以下命令,但步骤已完成:

find /cygdrive/c/Test/  -name TT_DETAIL*.gz | xargs | zcat | awk 'BEGIN { FS=OFS=","} { if ($11=="10") print $2,$3,$6,$10,$11,$17}' >>Op_TT_DETAIL.txt

find /cygdrive/c/Test/  -name TT_DETAIL*.gz -exec ./MonthwiseData.sh {} \;
其中cat MonthwiseData.sh

zcat *.gz | awk 'BEGIN { FS=OFS=","} { if ($11=="10") print $2,$3,$6,$10,$11,$17}' >>Op_TT_Detail.txt

我该怎么做?

我认为
while
循环是处理这些情况的最佳方法:

while IFS= read -r file
do
   awk '...' <(zcat "$file")
done < <(find . -type f -name "*gz")
试验 我们在当前目录中有一些
gz
文件:

$ for f in *gz; do echo "-- $f --"; zcat "$f"; done-- a.gz --
hello
bye
-- b.gz --
thisisB
bye
让我们
找到它们并只打印第一行的第一个字段:

$ while IFS= read -r file; do awk 'NR==1{print $1}' <(zcat "$file") >> output; done < <(find . -type f -name "*gz")

我想你正在寻找这样的东西:

find /cygdrive/c/Test/ -name "TT_DETAIL*.gz" -print0 | \
  xargs -0 -I file zcat file | \
  awk 'BEGIN { FS=OFS=","} { if ($11=="10") print $2,$3,$6,$10,$11,$17}' >>Op_TT_Detail.txt
  • find
    查找文件并
    -print0
    打印其名称
  • xargs-0
    允许您处理来自上一个管道的内容。使用
    -I文件
    我们将其命名为
    文件
    ,这样我们就可以执行
    zcat文件| awk
有趣的阅读:。

您可以将find命令括在记号中以创建参数列表,如:

awk '{print $0}' `find . -type f -name 'file*'` > concat_files.txt
这是一个简单的例子,与连接所有以“file”开头的文件相同。这只是我想在这里强调的记号

$ cat output 
thisisB
hello
find /cygdrive/c/Test/ -name "TT_DETAIL*.gz" -print0 | \
  xargs -0 -I file zcat file | \
  awk 'BEGIN { FS=OFS=","} { if ($11=="10") print $2,$3,$6,$10,$11,$17}' >>Op_TT_Detail.txt
awk '{print $0}' `find . -type f -name 'file*'` > concat_files.txt