搜索文件并在每个结果上运行脚本

时间:2014-11-21 13:52:50

标签: unix awk find xargs

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

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

find /cygdrive/c/Test/  -name TT_DETAIL*.gz

输出#1:

/cygdrive/c/Test/Feb2014/TT_DETAIL_20141115.csv.gz
/cygdrive/c/Test/Jan2014/TT_DETAIL_20141110.csv.gz
/cygdrive/c//Test/Mar2014/TT_DETAIL_20141120.csv.gz

第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

我该怎么做?

2 个答案:

答案 0 :(得分:1)

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

while IFS= read -r file
do
   awk '...' <(zcat "$file")
done < <(find . -type f -name "*gz")

您有find命令发送到while循环。这样,您就可以分开处理每个文件。

然后,这是执行基本awk '...' <(zcat "$file")zcat "$file" | awk '...'

的问题

在你的情况下:

while IFS= read -r file
do
   awk 'BEGIN { FS=OFS=","} { if ($11=="10") print $2,$3,$6,$10,$11,$17}' <(zcat "$file") >>Op_TT_Detail.txt
done < <(find /cygdrive/c/Test/  -name TT_DETAIL*.gz)

测试

我们在当前目录中有一些gz个文件:

$ for f in *gz; do echo "-- $f --"; zcat "$f"; done-- a.gz --
hello
bye
-- b.gz --
thisisB
bye

让他们find他们并打印第一行的第一个字段:

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

输出是:

$ 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
  • find查找文件,-print0打印其名称。
  • xargs -0允许您处理来自前一个管道的内容。使用-I file我们将其命名为file,以便我们可以zcat file | awk

有趣的阅读:xargs: How To Control and Use Command Line Arguments

答案 1 :(得分:0)

您可以将find命令括在刻度线中以创建参数列表,例如:

awk '{print $0}' `find . -type f -name 'file*'` > concat_files.txt

一个简单的例子,就像连接以“file”开头的所有文件一样。这只是我想在这里强调的刻度线。