कैसे एक फ़ाइल को विभाजित करने और सीधे संपीड़ित करने के लिए?


13

मेरे पास 100GB फ़ाइल है और मैं प्रत्येक 1GB फ़ाइल को 100 (लाइन ब्रेक द्वारा) विभाजित करना चाहता हूं

जैसे

split --bytes=1024M /path/to/input /path/to/output

उत्पन्न की गई 100 फाइलों के लिए, मैं इनमें से प्रत्येक फाइल में gzip / zip लगाना चाहता हूं।

क्या एकल आदेश का उपयोग करना संभव है?


2
प्रति फ़ाइल 1GB तक (यदि अगली पंक्ति इसे डालती है तो कम) --line-bytes=1024M
ब्रायन

जवाबों:


31

"--फिल्टर" का प्रयोग करें:

split --bytes=1024M --filter='gzip > $FILE.gz' /path/to/input /path/to/output


यह मेरे लिए काम नहीं करता है, एक ही फाइल को ओवरराइट करता रहता है क्योंकि $ FILE परिभाषित नहीं है और डेस फ़ोल्डर में भी नहीं लिखता है।
स्पलिसन

मेरी गलती, $ FILE को प्राप्त करने के लिए एकल उद्धरणों की आवश्यकता है, मेरी बड़ी गलती, माफी और मदद के लिए धन्यवाद: इस अंतिम कमांड ने मुझे 4 लाइनों के ब्लॉक में आने वाले फास्टक डेटा को बचाने के लिए काम किया: 'zcat ERR3152365.fastq .gz | स्प्लिट-ए ३ डी-एल १२००००० - न्यूमेरिक-प्रत्यय - फाइटर = z पिग-पी।> $ फिले.फक.गज़ ’- स्प्लिट / पार्ट_’
स्प्लिसन

0

सशर्त का उपयोग करने वाला एक-लाइनर उतना ही करीब है जितना आप आ सकते हैं।

cd /path/to/output && split --bytes=1024M /path/to/input/filename && gzip x*

gzipकेवल तभी चलेगा जब splitसशर्त &&जो सफल है cdऔर splitजो सुनिश्चित कर रहा cdहै के बीच भी सफल है, भी .. नोट करें कि आउटपुट निर्देशिका को निर्दिष्ट करने की क्षमता रखने के बजाय वर्तमान निर्देशिका में splitऔर gzipआउटपुट करें। यदि आवश्यक हो तो आप निर्देशिका बना सकते हैं:

mkdir -p /path/to/output && cd /path/to/output && split --bytes=1024M /path/to/input/filename && gzip x*

इसे वापस एक साथ रखने के लिए:

gunzip /path/to/files/x* && cat /path/to/files/x* > /path/to/dest/filename

0

-dविकल्प के साथ इस कमांड का उपयोग करने से आप संख्यात्मक उपसर्ग उत्पन्न कर सकते हैं।

split -d -b 2048m "myDump.dmp" "myDump.dmp.part-" && gzip myDump.dmp.part*

उत्पन्न फाइलें:

    myDump.dmp.part-00
    myDump.dmp.part-01
    myDump.dmp.part-02
    ...

0

पिग के साथ मक्खी पर संपीड़ित करने के लिए एक बैश फ़ंक्शन

function splitreads(){

# add this function to your .bashrc or alike
# split large compressed read files into chunks of fixed size
# suffix is a three digit counter starting with 000
# take compressed input and compress output with pigz
# keeps the read-in-pair suffix in outputs
# requires pigz installed or modification to use gzip

usage="# splitreads <reads.fastq.gz> <reads per chunk; default 10000000>\n";
    if [ $# -lt 1 ]; then
        echo;
        echo ${usage};
        return;
    fi;

# threads for pigz (adapt to your needs)
thr=8

input=$1

# extract prefix and read number in pair
# this code is adapted to paired reads
base=$(basename ${input%.f*.gz})
pref=$(basename ${input%_?.f*.gz})
readn="${base#"${base%%_*}"}"

# 10M reads (4 lines each)
binsize=$((${2:-10000000}*4))

# split in bins of ${binsize}
echo "# splitting ${input} in chuncks of $((${binsize}/4)) reads"

cmd="zcat ${input} \
  | split \
    -a 3 \
    -d \
    -l ${binsize} \
    --numeric-suffixes \
    --additional-suffix ${readn} \
    --filter='pigz -p ${thr} > \$FILE.fq.gz' \
    - ${pref}_"

echo "# ${cmd}"
eval ${cmd}
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.