ฉันมีไฟล์ 100GB และฉันต้องการแยกไฟล์เป็น 100 จาก 1GB แต่ละไฟล์ (แยกตามบรรทัด)
เช่น
split --bytes=1024M /path/to/input /path/to/output
สำหรับ 100 ไฟล์ที่สร้างขึ้นฉันต้องการใช้ gzip / zip กับไฟล์เหล่านี้แต่ละไฟล์
เป็นไปได้ไหมที่จะใช้คำสั่งเดียว?
ฉันมีไฟล์ 100GB และฉันต้องการแยกไฟล์เป็น 100 จาก 1GB แต่ละไฟล์ (แยกตามบรรทัด)
เช่น
split --bytes=1024M /path/to/input /path/to/output
สำหรับ 100 ไฟล์ที่สร้างขึ้นฉันต้องการใช้ gzip / zip กับไฟล์เหล่านี้แต่ละไฟล์
เป็นไปได้ไหมที่จะใช้คำสั่งเดียว?
คำตอบ:
ใช้ "- ตัวกรอง":
split --bytes=1024M --filter='gzip > $FILE.gz' /path/to/input /path/to/output
หนึ่งซับโดยใช้เงื่อนไขใกล้เคียงกับที่คุณสามารถมา
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
การใช้คำสั่งนี้พร้อม-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
...
ฟังก์ชั่นทุบตีเพื่อบีบอัดได้ทันทีด้วย 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}
}
--line-bytes=1024M
การใช้งาน