我有一個/user/test包含 2000 個壓縮檔案的目錄。我想檢查任何給定檔案是否有 5 條記錄,然后我必須以解壓縮格式存盤它。
我可以連續完成,但完成這項作業需要很多時間。
我連續地做如下:
for i in `find /user/test -iname "abc*.gz"`;
do
lines=`zcat $i | wc -l`
if [ $lines = 5 ]; then
fname=`basename -s .$file_ext $i`
echo "copying $fname to new path"
`zcat $i > new_path/$fname`
cnt=$((cnt 1))
else
echo "Ignoring file $i. Expecting 5 records. It has more or less records"
fi
done
我想同時做同樣的事情。
我嘗試探索 GNU parallel,但看到一個錯誤。我試過下面的命令
find /user/test -iname "abc*.gz" |
parallel 'zcat {} | awk 'NR == 5 {print $0}' < {}.txt'
上面的命令不起作用拋出錯誤。
uj5u.com熱心網友回復:
未經測驗:
doit() {
zcat "$@" | awk 'NR == 5 {print $0}'
}
export -f doit
find /user/test -iname "abc*.gz" |
parallel doit
根據您連續執行的操作:
doit() {
i="$1"
lines=`zcat $i | wc -l`
if [ $lines = 5 ]; then
fname=`basename -s .$file_ext $i`
echo "copying $fname to new path"
`zcat $i > new_path/$fname`
else
echo "Ignoring file $i. Expecting 5 records. It has more or less records"
fi
}
export -f doit
export file_ext
find /user/test -iname "abc*.gz" | parallel doit
總體思路是構建一個適用于單個輸入的 bash 函式。export函式(以及函式所需的變數)并并行運行函式。
好處是在單個輸入上測驗函式非常容易。
撰寫函式時有一個小問題:函式不能寫入硬編碼檔案,因為這會產生競爭條件(多個實體同時寫入)。因此,您需要以一種不會發生這種情況的方式撰寫函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/517852.html
標籤:Unix并行处理
下一篇:洗掉和壓縮目錄中的檔案
