วิธีการแยก stdout เพื่อไปยังไฟล์ที่ส่งออกหลาย ๆ


12

บอกว่าฉันมีคำสั่งcommandที่พิมพ์บรรทัดจำนวนมากไปยัง stdout:

line1
line2
.....
lineN

ฉันต้องการบันทึกผลลัพธ์ไปยังดิสก์ แต่ไม่ใช่ไฟล์เดียว แต่เป็นลำดับของไฟล์แต่ละไฟล์มี stdout 1,000 บรรทัด:

file0001.txt:
-------------
line1
....
line1000

file0002.txt:
-------------
line1001
....
line2000

etc

ฉันพยายาม google คำตอบ แต่ทุกครั้งที่ google ชี้ให้ฉันteeคำสั่งซึ่งไร้ประโยชน์ในสถานการณ์นี้ อาจเป็นเพราะฉันป้อนข้อความค้นหาไม่ถูกต้อง

คำตอบ:


24

เมื่อคุณบันทึกไฟล์เสร็จแล้วคุณสามารถsplitแบ่งไฟล์เป็นชิ้นส่วนไฟล์หรือไฟล์หลาย ๆ ไฟล์ตามจำนวนบรรทัด

split -l 1000 output_file

หรือดียิ่งขึ้นเพียงแค่ลอง

command | split -l 1000 -

สิ่งนี้จะแบ่งเอาต์พุตสตรีมออกเป็นไฟล์ที่มี 1,000 บรรทัดแต่ละบรรทัด (ค่าเริ่มต้นคือ 1,000 บรรทัดโดยไม่มีตัวเลือก -l)

คำสั่งด้านล่างจะให้ความยืดหยุ่นเพิ่มเติมแก่คุณในการใส่หรือบังคับใช้คำนำหน้ากับชื่อไฟล์ที่จะสร้างขึ้นเมื่อมีการสร้างเอาต์พุตและแยกเพื่อจัดเก็บลงในไฟล์

command | split -l 1000 - small-


ฉันสับสนดังนั้นสำหรับคนอื่น ๆsplit [arguments...] [input e.g. "-" for stdin] [output_prefix]ตัวอย่างเช่นtar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-มันจะส่งไฟล์จำนวน 100MB ที่ชื่อsomedir.tar.part-000001, 002 และอื่น ๆ
ThorSummoner

3

คุณสามารถใช้สคริปต์ทุบตี lines.bash

#!/bin/bash
a=0
while IFS='' read -r line
do
  printf -v filename "%04d.txt" "$((a++/1000))"
  echo "$line" >> $filename
done

และใช้เป็น:

cat long_file.txt | bash lines.bash

ปัญหาเดียวที่ฉันสังเกตเห็นคือการ*ลงชื่อเข้าใช้long_file.txt(บางคนสามารถแก้ไขได้)


2
ตลาดหลักทรัพย์ฯจะว่างสตริงเพื่อหลีกเลี่ยงการแยกคำIFS readใช้เพื่อปิดทับขวาหลบหนี-r readเอาออกเพื่อหลีกเลี่ยงการหลบหนีทับขวาบน-e ใช้ข้อความที่จะหลีกเลี่ยงการแยกคำecho echoใช้-vในbashตั้งแต่ 4.0 เพื่อหลีกเลี่ยงการเริ่มต้นกระบวนการย่อย ใช้การเพิ่มภายหลังเนื่องจากรหัสปัจจุบันของคุณจะใส่ในไฟล์แรกเพียง 999 บรรทัด a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
จัดทำ

@ การจัดการขอบคุณ เฉพาะของฉันprintfไม่มี-vสวิตช์ ( bash 4.2.10) อย่างน้อยมันไม่ได้อยู่ใน manpage ของprintf
xralf

1
man printfเอกสาร / usr / bin / printf ที่ไม่เคยมีมาก่อนในชีวิตตั้งค่าตัวแปรสภาพแวดล้อม ดูhelp printfสำหรับprintfเปลือกในตัวเอกสารของ
จัดการ

@ การจัดการงานตกลง ดูเหมือนว่าจะมีข้อผิดพลาดทางไวยากรณ์ใน++/ส่วนนี้
xralf

1
อีกอย่างหนึ่ง: ไม่จำเป็นต้องใช้ sigil ในการประเมินผลทางคณิตศาสตร์เว้นแต่ว่าคุณต้องการการขยายพารามิเตอร์อย่างชัดเจน ในการขยายเลขคณิตตัวแปรจะได้รับการประเมินต่อไป
จัดทำ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.