จะแบ่งไฟล์และบีบอัดโดยตรงได้อย่างไร?


13

ฉันมีไฟล์ 100GB และฉันต้องการแยกไฟล์เป็น 100 จาก 1GB แต่ละไฟล์ (แยกตามบรรทัด)

เช่น

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

สำหรับ 100 ไฟล์ที่สร้างขึ้นฉันต้องการใช้ gzip / zip กับไฟล์เหล่านี้แต่ละไฟล์

เป็นไปได้ไหมที่จะใช้คำสั่งเดียว?


2
สำหรับถึง 1GB ต่อไฟล์ (น้อยถ้าบรรทัดถัดไปจะใส่มันมากกว่า) --line-bytes=1024Mการใช้งาน
Brian

คำตอบ:


31

ใช้ "- ตัวกรอง":

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


นี่ไม่ใช่ twork สำหรับฉันเขียนทับไฟล์เดียวกันเนื่องจาก $ FILE ไม่ได้ถูกกำหนดไว้และไม่ได้เขียนลงในโฟลเดอร์ des
20654 splaisan เมื่อ

ความผิดพลาดของฉันต้องใช้อัญประกาศเดียวเพื่อรับ $ FILE แทนที่ความผิดพลาดใหญ่ขอโทษและขอบคุณสำหรับความช่วยเหลือ: คำสั่งสุดท้ายนี้ทำงานเพื่อให้ฉันบันทึกข้อมูล fastq ที่มาในบล็อกของ 4 บรรทัด: 'zcat ERR3152365.fastq.gz | แยก -a 3 -d -l 1200000 - ตัวเลข - คำต่อท้าย --filter = 'pigz -p 8> $ FILE.fq.gz' - splitout / part_ '
อ่าน

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

ฟังก์ชั่นทุบตีเพื่อบีบอัดได้ทันทีด้วย pigz

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}
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.