2017-06-02 149 views
1

我想在find命令返回的zip文件上使用awk命令,并将zip文件中的某些特定列转储到与zip文件具有相同层次结构的新文件中。在压缩文件上使用awk查找命令

例如,我有一个像结构:

/2017/05/25/GAURshvol20170525.txt.zip 
/2017/05/26/GAURsh20170526.txt.zip 
/2017/05/26/GUPTsh20170526.txt.zip 
/2017/05/26/GUPTshvol20170526.txt.zip 
/2017/05/26/GAURshvol20170526.txt.zip 
/2017/05/30/GAURshvol20170530.txt.zip 
/2017/05/30/GAURsh20170530.txt.zip 
/2017/05/30/GUPTsh20170530.txt.zip 
/2017/05/30/GUPTshvol20170530.txt.zip 
/2017/05/31/GAURsh20170531.txt.zip 
/2017/05/31/GUPTsh20170531.txt.zip 
/2017/05/31/GUPTshvol20170531.txt.zip 

而且在压缩文件内的每个文件我遇到了下列数据:

20170601|A|69636|122548|Z 
20170601|AA|67544|128724|Z 
20170601|AAAP|453|1306|Z 
20170601|AAC|5840|8962|Z 
20170601|AADR|1925|1925|Z 
20170601|AAL|289708|344209|Z 
20170601|AAMC|10|15|Z 
20170601|AAME|100|200|Z 
20170601|AAN|44851|72461|Z 
20170601|AAOI|42836|82801|Z 
20170601|AAON|3417|4127|Z 
20170601|AAP|71212|85414|Z 
20170601|AAPL|528135|1213451|Z 
20170601|AAT|7742|10104|Z 
20170601|AAU|2200|2700|Z 
20170601|AAV|2746|6797|Z 
20170601|AAWW|4662|7298|Z 
20170601|AAXJ|54464|57764|Z 
20170601|AAXN|45497|48611|Z 

现在,我想取从上面的一些特定的列,并将这些转储到具有相同类型层次结构的新目录中的新文件中,就像我已经将数据转储到目录abcd中一样,那么层次结构应该类似于

gaur/2017/05/25/GAURshvol20170525.txt 
gaur/2017/05/26/GAURsh20170526.txt 
gaur/2017/05/26/GUPTsh20170526.txt 
gaur/2017/05/26/GUPTshvol20170526.txt 
gaur/2017/05/26/GAURshvol20170526.txt 
gaur/2017/05/30/GAURshvol20170530.txt 
gaur/2017/05/30/GAURsh20170530.txt 
gaur/2017/05/30/GUPTsh20170530.txt 
gaur/2017/05/30/GUPTshvol20170530.txt 
gaur/2017/05/31/GAURsh20170531.txt 
gaur/2017/05/31/GUPTsh20170531.txt 
gaur/2017/05/31/GUPTshvol20170531.txt 

我想下面的命令,(目前我的PWD是2017年和野牛父目录):

find -name 'GAUR*.zip' -exec awk -F"|" '{print $2,$3 > (FILENAME "-new")}' {} + 

其导致无限期等待。我更喜欢在查找部分使用正则表达式,如果有人可以请,因为我用过。

find . -regex '.^GAUR*\.\(zip\|\)' 

但失败。

+1

检查的'组合用'-exec'选项调用'zcat | awk'找到''可以工作。 –

回答

1

在当前目录中查找所有文件递归地以GAUR开始并以.zip结尾,按行读取输出,创建目录,解压缩文件并将输出重定向到awk print 2.和3. col到当前目录中的文件/ gaur /原始文件路径(sed将文件名中的.zip扩展名剪切掉)而不用.zip结尾。

find -name 'GAUR*.zip' | while read line ; do mkdir -p gaur/$(dirname $line) && unzip -p $line | awk -F"|" '{ print $2","$3 }' > ./gaur/$(echo $line | sed 's/.zip$//g') ; done 

您必须首先解压文件,然后才能在文件上运行awk。所以我做了这个丑陋的班轮来做这件事。但很难修改,所以我会使用常规的shell脚本。

+0

荣誉,感谢@Edvin,它的工作。 (Y), 我是通过使用shell脚本完成的。 – ggupta

+0

可否请让我知道,我如何使这个失败? – ggupta

+0

问题可能在于您没有写入权限来创建文件夹。如果mkdir命令因为解压缩不会运行而失败。如果第一次失败,&&不允许下一个命令运行。我认为许可问题可能是这一班轮班最常见的问题。 – Edvin

1

这不是一个简单的解决方案,因为您需要awk中文件的文件名和内容。问题是你不能在-exec中使用管线。

没有额外文件的解决方案将调用-exec sh -c 'zcat | awk',但是然后你会在awk部分转义工作。

但是,最好的办法是做一个这样的脚本:

script.sh:

#!/bin/sh 
for i in "[email protected]" ; do 
    mkdir -p gaur/"$(dirname "$i")" 
    filename="$(echo gaur/"$i" | sed 's/\.zip$//')" 
    zcat "$i" | awk -F'|' -v filename="$filename" '{print $2,$3 > filename}' 
done 

,然后只需拨打:

find 2017 -regex '.*/GAUR.*\.zip' -exec ./script.sh {} +

+0

感谢您的好选择,它的工作。 – ggupta

相关问题