2012-10-25 53 views
2

我有一個文件夾在一堆gzip壓縮文件,其中每個文件的每一行的形式爲:如何在Bash/Sed/Awk的文件夾中的每個gz上運行RegExp Sub?

thing, thing2, something, thing4, other_thing, etc... 

所有我想要做的就是更換前兩個逗號在每個文件的每一行與標籤,使每一行應該是這樣的:

thing\t thing2\t something, thing4, other_thing, etc... 

有一噸的這些文件,所以我只是在尋找運行這個龐大的更換速度最快,最無痛的方式。最後,我希望所有具有相同文件名稱的相同文件只是一個替換文件。想法?

回答

2

未測試:

#!/bin/bash 
[[ -d $1 ]] || exit 1 
for gz in "$1"/*.gz ; do 
    zcat "$gz" | sed 's/,/\t/;s/,/\t/' > "$gz".tmp 
    gzip "$gz".tmp 
    mv "$gz".tmp.gz "$gz" 
done 
+0

除了sed之外的工作對於「\ t」替換某些OS'(即OS X)上的選項卡不可靠。更可靠的就是使用放入字面標籤,或使用awk代替sed。儘管爲我完成了工作,所以+1!謝謝! – Eli

+0

我更喜歡'$'\ t'到bash腳本中的字面標籤。空格可以通過文本編輯器進行更改。 – choroba

+1

確保您在上面每行的結尾處添加「&&」,以創建/更新文件,否則如果您無法寫入tmp文件,您最終會切換原始文件。 –

1

您可以用GNU做這個發現和GNU並行:

find . -maxdepth 1 -type f -print0 | parallel -0 \ 
    gzip -dc {} \| sed "s/,/$'\t'/; s/,/$'\t'/" \| gzip \> {}.tmp \; mv {}.tmp {} 

--dry-run平行,看看會發生什麼。

相關問題