2017-06-02 148 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

相關問題