ฉันจะรวมบรรทัดทั้งหมดในไฟล์ข้อความเป็นบรรทัดเดียวได้อย่างไร


28

ฉันต้องการให้ทุกบรรทัดในข้อความเป็นหนึ่งบรรทัด ฉันเป็นผู้เริ่มหัดเขียนโปรแกรมที่พยายามเรียนรู้ด้วยการทำ ฉันใช้เวลาสี่ชั่วโมงพยายามแก้ปัญหานี้ ฉันรู้ว่ามีวิธีแก้ไขปัญหานี้อย่างง่าย นี่คือสิ่งที่ฉันพยายาม

sed -e 'N; s / \ n //' myfile.txt # ไม่ทำอะไรเลย

sed -e: a -e N -e 's / \ n / /' -e ta myfile.txt # เอาท์พุทสับสนและฉันไม่สามารถทำหัวหรือส่วนท้ายของไวยากรณ์ได้

cat myfile.txt | tr -d '\ n'> myfile.txt # ลบทุกบรรทัด

นี่คือไฟล์ข้อความ:

500212
262578-4-4
23200
ห้องปฏิบัติการ GRIFFITH LTD
ห้องปฏิบัติการ GRIFFITH
เซาท์ดูบลินเคาน์ตีสภา
สำนักงาน
สำนักงาน (อุตสาหกรรม)
รายการอัตรา
2 นิคมอุตสาหกรรม Pineview
ถนน Firhouse
Knocklyon
31 ธันวาคม 2550
1 มกราคม 2551 "   

ฉันคิดไม่ออกว่าฉันผิดไปไหน ....

คำตอบ:


31

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

cat myfile.txt | tr -d '\ n'> oneline.txt

\r\nคุณต้องจำไว้บางบรรณาธิการยุติเส้นด้วย สำหรับกรณีนั้นให้ใช้

cat myfile | tr -d '\r\n'

ขอขอบคุณสำหรับความช่วยเหลือ แต่ก็ยังใช้งานไม่ได้ ฉันรู้ว่ามันเป็นสิ่งพื้นฐานและเรียบง่าย คำสั่งที่คุณให้ลบทุกบรรทัด ฉันจะโพสต์ไฟล์ 500212 262578-4-4 23200 GRIFFITH LABORATORIES LTD ห้องปฏิบัติการ GRIFFITH SOUTH DUBLIN สำนักงานสภาเทศบาลเมือง (อุตสาหกรรม) รายการอัตราค่าบริการ 2 Pineview Road Firock Road Knocklyon 31 ธ.ค. 2007
John

@JOhn: ผลลัพธ์หรือข้อผิดพลาดคืออะไร?
ish

ฉันกำลังจะโพสต์โดยแก้ไขคำตอบของฉัน หลังจากฉันใช้คำสั่งไฟล์ว่างเปล่า ดูเหมือนว่าจะอยู่ในเทอร์มินัล "cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt" ขอบคุณอีกครั้ง.
John

@John: คุณไม่สามารถใช้ชื่อไฟล์เอาต์พุตเดียวกันได้ !! (ดูคำตอบ) โปรดลองcat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
ish

1
วิธีที่ดีกว่าในการทำเช่นนี้คือtr -d '\n' <input.txt > output.txtหลีกเลี่ยงการใช้แมวที่ไร้ประโยชน์และใช้ท่อที่ไม่จำเป็นเพียงท่อเดียว
evilsoup

8

นี่มันคือ มันเป็นอีกทางออกหนึ่งและเรียบง่ายง่าย

echo $(cat Input.txt) > Output.txt

2
ฉันไม่อยากจะเชื่อเลยว่ามันใช้งานได้ดีมาก
mchid

echo `cat Input.txt` > Output.txt ทำงานได้ดีเหมือนกันอีกอย่างหนึ่ง
raider33

หากมีช่องว่างสีขาวมากกว่าหนึ่งช่อง (ช่องว่างแท็บขึ้นบรรทัดใหม่และอื่น ๆ ) ในส่วนเดียวพวกเขาจะถูกแทนที่ด้วยช่องว่าง
iBug

นี่เป็นทางออกที่ดี แต่บนคอมพิวเตอร์ของฉันฉันพบว่าใช้เวลานานถึงสามเท่าในการtrแก้ไขปัญหา
LS

3

วิธีการง่ายๆ

อีกวิธีใช้ awk

cat myfile.txt | awk '{print}' ORS=''

เอาท์พุท:

500212262578-4-423200GRIFFITH LABORATORIES LTDGRIFFITH LABORATORIESSOUTH ดูบลินเคาน์ตีประเทศสภาอุตสาหกรรม (อุตสาหกรรม) รายการ Rateable2 นิคมอุตสาหกรรม Pineview RoadKnocklyon31 ธ.ค. 200701 ม.ค. 2551 "

บันทึก:

ORS = '' -> นี่คือตัวคั่นฟิลด์ของคุณคุณสามารถมีอักขระใด ๆ ระหว่างเครื่องหมายคำพูดเดี่ยวเป็นตัวคั่นฟิลด์ ด้วยวิธีการ awk นี้เราสามารถรวมช่องว่างและตัวละครทั้งหมด

หวังว่ามันจะช่วยได้!


1
ORS เป็นตัวแยกบันทึกผลลัพธ์ OFS เป็นตัวแยกฟิลด์เอาต์พุต ดูthegeekstuff.com/2010/01/…หรือman awk
Elder Geek

3

ไม่จำเป็นต้องวางฉลากไว้:aนอกคำแนะนำหลักและไม่-eจำเป็นต้องใช้ตัวเลือก ในที่สุด the /$/ฟุ่มเฟือย (ทุกบรรทัดมีอักขระ EOL)

การปรับปรุงคำตอบอื่น ๆ จะได้รับ

sed -i ':a; N; s/\n/ /; ta' file

ซึ่งจะชัดเจนกว่าถ้าเขียนดังนี้

sed -i ':a
        N
        s/\n/ /
        ta' file

คำสั่งทำงานดังนี้:

  1. N ต่อท้ายบรรทัดถัดไปกับพื้นที่รูปแบบ (หลายบรรทัด) ซึ่งมีบรรทัดปัจจุบันอยู่แล้ว
  2. s/\n/ /แทนตัวอักษรขึ้นบรรทัดใหม่\nที่สร้างขึ้นโดยNมีช่องว่าง;
  3. taไปบรรทัดต่อไปนี้สคริปต์ฉลาก:a ตราบใดที่ทดแทนในขั้นตอนที่ 2 ประสบความสำเร็จ , เช่นถ้าเปลี่ยนตัวที่เกิดขึ้นการดำเนินการกระโดดไปขั้นตอนที่ 1 โดยไม่ต้อง "กดปุ่ม" สิ้นสคริปต์เช่น โดยไม่ต้องอ่านบรรทัดของการป้อนข้อมูลอื่น

หมายเหตุดังต่อไปนี้

  • sedอ่านสายของแฟ้มใส่หนึ่งโดยหนึ่งในการสั่งซื้อที่เริ่มต้นจากสายที่ 1 ;
  • :a เป็นเพียงป้ายกำกับไม่ใช่คำสั่งที่จะดำเนินการ
  • N โดยหลักการแล้วจะดำเนินการในบรรทัดใดก็ได้ แต่
  • s/\n/ /(ในหลักการที่ดำเนินการบนบรรทัดใด ๆ ) จะประสบความสำเร็จในบรรทัดใด ๆ แต่สุดท้ายจะเป็นเช่นนั้น
  • taทำให้จุดสิ้นสุดของสคริปต์เข้าถึงได้เฉพาะเมื่อบรรทัดสุดท้ายของอินพุตถูกอ่าน (บรรทัดเดียวที่sล้มเหลว) ดังนั้น
  • จะไม่มีการอ่านบรรทัดอินพุตเพิ่มเติมในพื้นที่รูปแบบหลังจากอ่านบรรทัดที่1ยกเว้นว่ามีการอ่านบรรทัดสุดท้ายแต่ไม่มีบรรทัดเพิ่มเติมที่จะอ่านและpคำสั่งimplicit จะถูกดำเนินการ

ดังนั้นโดยทั่วไปสคริปต์จะอ่านในบรรทัดที่ 1ของอินพุตและต่อท้ายบรรทัดต่อไปนี้ทีละหนึ่งทุกครั้งที่แทนที่บรรทัดใหม่ด้วยช่องว่าง; หลังจากบรรทัดสุดท้ายถูกต่อท้าย (และ\nเปลี่ยนเป็นช่องว่าง) Nไม่สามารถต่อท้ายบรรทัดใด ๆsล้มเหลวtaถูกข้ามไปถึงจุดสิ้นสุดของสคริปต์และpคำสั่ง rint โดยนัยจะถูกดำเนินการบนพื้นที่รูปแบบ looong 1 บรรทัดปัจจุบัน .

-iตัวเลือกทดแทนแฟ้มใส่fileกับพื้นที่รูปแบบ 1 เส้นทั้ง


2

gedit:

ค้นหาและแทนที่\nด้วยช่องว่าง ''
คุณสามารถรับหน้าต่างแทนที่ได้โดยไปที่ 'ค้นหา' -> 'แทนที่'
หรือผ่านทางแป้นลัดCtrl+H

ดูภาพหน้าจอด้านล่าง:

ข้อความต้นฉบับของคุณอยู่ในบรรทัดที่ 1-14
ผลลัพธ์คือบรรทัดที่ 16

ป้อนคำอธิบายรูปภาพที่นี่



1

ลองสิ่งนี้

sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]

http://anandsekar.github.io/joining-all-lines-in-a-file-using-sed/


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

0

ฉันคิดว่าคุณแค่ลืมว่าคุณต้องบอกให้ sed เปลี่ยนเส้นทางของ yourfile.txt ไปยังผลลัพธ์ที่ต้องการ newfile.txt นี้ดูเหมือนจะเป็นคำสั่งที่คุณต้องการ แต่เฉพาะในกรณีที่ไฟล์ที่คุณกำลังพยายามที่จะผสานจะไม่ใหญ่เกินไปสำหรับบัฟเฟอร์ sed sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txtของ: เครดิตให้กับฟอรั่มที่นี่อีกที่พวกเขาพูดคุยกัน sed ความสามารถ ฉันทดสอบคำสั่งแล้วและก็ใช้ได้กับฉัน


1
ที่จริงsedกับ-iสวิทช์จะปรับเปลี่ยนไฟล์ต้นฉบับแบบอินไลน์จึงมีความจำเป็นที่จะส่งออกไปยังไฟล์อื่นไม่มี ระวังหน่อย!
ish

ฉันลอง sed -e: a -e N -e 's / \ n / /' -e ta reval_details.asp หรือไม่ Pno = 500214.txt 01 Jan 2008 ที่อยู่อาศัยอสังหาริมทรัพย์ sed -i: a -e N-e / \ n / / '-e ta reval_details.asp? Pno = 500214.txt sed: ไม่สามารถหาป้ายกำกับสำหรับข้ามไปยังa' sed -i :a -e N -i 's/\n/ /' -e ta reval_details.asp?Pno=500214.txt sed: can't find label for jump to ' sed -e: a -e N -i 's / \ n / /' -e ta reval_details .asp? Pno = 500214.txt sed: ไม่สามารถอ่าน s / \ n / /: ไม่มีไฟล์หรือไดเรกทอรี # แนวคิดใด ๆ
John

@ Mik ฉันยังไม่มีโชค แต่ขอบคุณสำหรับการตอบกลับ
จอห์น

ฉันคัดลอกและวางข้อความของคุณลงในโปรแกรมแก้ไขข้อความและบันทึกไฟล์จากนั้นใช้คำสั่ง sed ของฉันและมันทำให้มันปรากฏในบรรทัดเดียวเมื่อเปิดใน nano; อย่างไรก็ตามหากคุณเปิดไฟล์โดยใช้ cat ในเทอร์มินัลไฟล์นั้นจะถูกห่อและไม่ปรากฏเป็นเพียงบรรทัดเดียวดังนั้นบางทีนั่นอาจเป็นสิ่งที่เกิดขึ้น นอกจากนี้คุณไม่จำเป็นต้องมี 'ก่อนหน้านี้และฉันคิดว่าคุณได้เพิ่มองค์ประกอบที่ไม่จำเป็นอื่น ๆ ลงในคำสั่งด้านบนดังนั้นให้ลองใช้ sed -e: a -e N -e' s / \ n / / '-e ta yourfile.txt> newfile.txt บรรทัดนั้นยาวพอที่จะปรากฏบนหน้าจออย่างไรก็ตามหากคุณมีจอภาพขนาด 30 นิ้วขึ้นไป!

@ Mikikers สำหรับโพสต์ ฉันพิมพ์ข้อมูลลงในโปรแกรมแก้ไขข้อความแล้วบันทึกและเรียกใช้ 'sed -e: a -e N -e' s / \ n / / '-e ta abc.txt> abc1.txt' และทำงานได้ อย่างสมบูรณ์ คำอุทานสรรเสริญพระผู้เป็นเจ้า ฉันพิมพ์ 'sed -e: a -e N -e' s / \ n / / '-e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt' และทุกบรรทัดนอกเหนือจากบรรทัดแรกมี พื้นที่ที่เพิ่มเข้าไปในจุดเริ่มต้นของบรรทัด ฉันซาบซึ้งในความพยายามของคุณ แต่ฉันคิดว่าฉันจะไปสู่ระดับแปดเสียงและลองประมวลผลข้อมูลที่นั่น
John




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