【问题标题】:Search files and run a script on every result搜索文件并对每个结果运行脚本
【发布时间】:2015-01-19 16:36:01
【问题描述】:

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

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

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

我该怎么做?

【问题讨论】:

    标签: unix awk find xargs


    【解决方案1】:

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

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

    您有一个find 命令被发送到while 循环。这样,您可以单独处理每个文件。

    然后,执行基本的awk '...' &lt;(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

    【讨论】:

      【解决方案2】:

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

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

      一个简单的例子,它与真正连接所有以“file”开头的文件相同。这只是我想在这里强调的标记。

      【讨论】:

        猜你喜欢
        • 2015-01-25
        • 2023-03-15
        • 1970-01-01
        • 2011-05-05
        • 1970-01-01
        • 2020-12-12
        • 1970-01-01
        • 2014-12-22
        • 1970-01-01
        相关资源
        最近更新 更多