คำสั่ง sed พื้นฐานสำหรับไฟล์บรรทัดเดียวขนาดใหญ่: ไม่สามารถจัดสรรหน่วยความจำใหม่ได้


10

ฉันมีไฟล์ข้อความ 250 MB ทั้งหมดนี้อยู่ในบรรทัดเดียว

ในไฟล์นี้ฉันต้องการแทนที่aตัวละครด้วยbตัวอักษร:

sed -e "s/a/b/g" < one-line-250-mb.txt

มันล้มเหลวด้วย:

sed: couldn't re-allocate memory

สำหรับฉันดูเหมือนว่างานประเภทนี้สามารถดำเนินการแบบอินไลน์โดยไม่ต้องจัดสรรหน่วยความจำมาก
มีเครื่องมือที่ดีกว่าสำหรับงานหรือวิธีการใช้ที่ดีกว่าsedหรือไม่?


GNU sed เวอร์ชั่น 4.2.1
Ubuntu 12.04.2 LTS
RAM 1 GB



4
คำถามนั้นเกี่ยวกับการแสดงออกหลายสายที่ซับซ้อนมาก คำถามของฉันเกี่ยวกับการแสดงออกขั้นพื้นฐานที่สุดที่คุณสามารถจินตนาการได้
นิโคลัสราอูล

@RubanSavvy plus ไม่คำตอบในคำถามอื่น ๆ ที่คำนึงถึงสายยาวและในความเป็นจริงทั้งสองอาจจะมีปัญหาเดียวกัน
terdon

คุณสามารถรวมรุ่น sed ของคุณใน Q นี้และข้อมูลฮาร์ดแวร์ของคุณ (RAM โดยเฉพาะ) และรุ่น distro ได้หรือไม่
slm

คำตอบ:


10

ใช่ใช้trแทน:

tr 'a' 'b' < file.txt > output.txt

sedข้อตกลงในสายดังนั้นสายใหญ่จะทำให้เกิดปัญหา ฉันคาดหวังว่ามันจะประกาศตัวแปรภายในเพื่อเก็บสายไว้และอินพุตของคุณเกินขนาดสูงสุดที่จัดสรรให้กับตัวแปรนั้น

tr ในทางกลับกันจัดการกับตัวละครและควรจะสามารถจัดการกับสายยาวโดยพลการอย่างถูกต้อง


อยากรู้อยากเห็นฉันเพิ่งสร้างไฟล์ 250MB ที่เต็มไปด้วย "abcabc ... " และสามารถทำได้sed -e "s/a/z/g" b.txt > c.txtโดยไม่มีปัญหาใด ๆ ใช้ sed (GNU sed) 4.2.2
slm

@slm เหมือนกันที่นี่ในไฟล์ 496M และsedรุ่นเดียวกันเดาว่ามันขึ้นอยู่กับการนำไปใช้งานหรือฮาร์ดแวร์
terdon

sedใช่ถ้าผมต้องเดาตัวผู้ที่เราจัดการกับรุ่นเก่า
slm

5

เวอร์ชั่นเก่าของ sed และ awk มีปัญหาเกี่ยวกับหน่วยความจำซึ่งส่วนใหญ่ได้รับการแก้ไขในเวอร์ชันที่ใหม่กว่า แต่หนึ่งในปัญหาคลาสสิคที่เกิดขึ้นกับLarry Wall ก็ค่อนข้างยาก คำตอบของเขาคือเขียนภาษาโปรแกรมใหม่ - โดยไม่ จำกัด หน่วยความจำนอกเหนือจากฮาร์ดแวร์ เขาเรียกมันว่า Perl ปัญหาเฉพาะของคุณสามารถแก้ไขได้ง่ายขึ้น แต่กฎทั่วไปที่ฉันใช้คือเมื่อ sed จะไม่ใช้ perl

แก้ไข: โดยขอตัวอย่าง:

perl -pe "s/a/b/g" < one-line-250-mb.txt

หรือสำหรับการใช้หน่วยความจำน้อย:

perl -e 'BEGIN{$/=\32768}' -pe "s/a/b/g" < one-line-250-mb.txt

1
ย่อหน้าทั้งหมดนี้ย่อมาจาก "Perl." รายละเอียดบางอย่างน่าจะดีหรืออย่างน้อยก็เป็นตัวอย่างหรือบางอย่าง
Michael Mrozek

@MichaelMrozek ฉันรู้ว่าการสะสมหมวกมักจะนำไปสู่การ roboediting แต่ฉันคิดว่าชื่อเสียงของคุณคุณจะให้ความสนใจมากขึ้น โดยเฉพาะอย่างยิ่งปัญหาที่ได้รับการแก้ไขแล้วในทางแคบมากที่จะไม่ช่วยคนส่วนใหญ่ค้นหาดังนั้นฉันจึงเพิ่มคำตอบสำหรับกรณีทั่วไป คำตอบที่เพิ่มขึ้นที่ฉันให้ไว้จะช่วย Nicolas Raoul ถ้ายังไม่มีวิธีแก้ปัญหาที่ใช้การได้ แต่ฉันสงสัยว่ามันจะช่วยคนอื่น ๆ ได้มากในขณะที่คำตอบดั้งเดิมของฉันจะช่วยทุกคนที่ถึงขีด จำกัด หากคุณไม่เห็นด้วยฉันจะลบ
hildred

@hildred ฉันไม่คิดว่ามันมากเกินไปที่จะขอให้คุณเชื่อในความถูกต้องของผู้ดูแลเมื่อพวกเขาแสดงความคิดเห็นที่ถูกต้องกับคำตอบของคุณโดยไม่ต้องหันไปหาข้อกล่าวหาเรื่องแรงจูงใจที่ซ่อนเร้นในทันที
Chris Down

@ChrisDown ตรงกันข้าม - ฉันใส่หมวกทั้งหมดแล้ว นอกจากนี้สิ่งนี้ยังถูกตั้งค่าสถานะว่าไม่ใช่คำตอบจากหลาย ๆ คน แต่นั่นเป็นสิ่งที่สำคัญอันดับสองสำหรับหมวก
Michael Mrozek

อันที่สองที่มีการ จำกัด หน่วยความจำทำเคล็ดลับ (สำหรับไฟล์ 2.5GB 1 บรรทัดของฉัน): ขอบคุณ! ผิดหวังนิดหน่อยโดยsedแม้ว่า : \
Tomislav Nakic-Alfirevic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.