【问题标题】:Search files and run a script on every result - Cont:搜索文件并在每个结果上运行脚本 - 续:
【发布时间】:2015-01-25 21:52:28
【问题描述】:

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

Step1:例如:当前正在搜索此模式 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

第二步:

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

猫 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,以下脚本在没有文件名的情况下也能正常工作。

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 文件,我是否应该将“find /cygdrive/c/Test/ -name TT_DETAIL*.gz”写入另一个输出文件 然后将该输出文件调用到脚本中,我没有对位于服务器的源文件的写访问权限。

寻求您的建议!!!

【问题讨论】:

  • 您已经问了很多 awk 问题,但您仍然在做绝对初学者的事情,例如将条件放入操作块中。 awk 脚本编写为awk '&lt;condition&gt; { &lt;action&gt; }',而不是awk '{ if (&lt;condition&gt;) &lt;action&gt; }',我知道您以前的答案向您展示了如何将shell 变量的值传递给awk 脚本。如果你不从他们那里学到任何东西,我们提供答案是没有意义的。

标签: unix awk find xargs


【解决方案1】:

很高兴看到您在上一个问题中使用的是 sn-p 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 命令中使用它。

【讨论】:

  • Fedorqui ,出于好奇,对我的 cmets 显示的“1”等于“不客气”……或者其他一些东西!!!
  • 哈哈是的,就像在说:“是的,我很高兴它对你有用!我不知道除此之外还能说什么,所以我会说 +1 来实现它更短:))"
  • 非常感谢分享和帮助他人,上面的脚本节省了我在 Excel / Access 中的大量手动工作!!!
  • 不客气,我很高兴读到这篇文章。你的问题总是清晰而富有挑战性,所以我试着回答它们,因为我自己总是能学到一些东西。
猜你喜欢
  • 2015-01-19
  • 2023-03-15
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 2013-08-01
  • 2019-11-19
相关资源
最近更新 更多