Unix 搜索文件并对每个结果运行脚本
我想知道如何在所有子目录(按月份/按日期-创建的子目录)中搜索特定模式的文件。然后,对找到的文件执行脚本 步骤1:例如:当前正在按此模式搜索文件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
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