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

时间:2014-11-27 10:26:42

标签: unix awk find xargs

我想知道如何在所有子目录中搜索某些模式的文件(GunZip文件)(月份/日期明智 - 创建子目录)。 然后,在找到的文件上执行脚本。还需要填充FILENAME以及输出以进行跟踪以及对特定文件的进一步分析。

步骤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

ZZZ,AAA,ECH,1,10,XXX
ZZZ,BBB,ECH,1,10,XXX
ZZZ,CCC,ECH,1,10,XXX
ZZZ,DDD,ECH,1,10,XXX

感谢fedorqui以下脚本在没有FILENAME的情况下正常工作。

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)

尝试使用以下命令将FILENAME与输出一起填充以进行跟踪:

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

期望的输出:

 ZZZ,AAA,ECH,1,10,XXX,/cygdrive/c/Test/Feb2014/TT_DETAIL_20141115.csv.gz
 ZZZ,BBB,ECH,1,10,XXX,/cygdrive/c/Test/Feb2014/TT_DETAIL_20141115.csv.gz
 ZZZ,CCC,ECH,1,10,XXX,/cygdrive/c//Test/Mar2014/TT_DETAIL_20141120.csv.gz 
 ZZZ,DDD,ECH,1,10,XXX,/cygdrive/c//Test/Mar2014/TT_DETAIL_20141120.csv.gz 

由于FILENAME不适用于* .gz文件,我应该写&#34; find /cygdrive/c/Test/ -name TT_DETAIL*.gz&#34;到另一个输出文件  然后将该输出文件调用为脚本,我没有对位于服务器的源文件进行写访问。

寻找你的建议!!!

1 个答案:

答案 0 :(得分:2)

很高兴看到您在上一个问题中使用了代码段I wrote

我会用这个:

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

也就是说,使用-v file="$file",您可以将文件名作为变量提供给awk。然后在print命令中使用它。