bash / sed / awk / etc ลบบรรทัดใหม่อื่น ๆ ออก


39

คำสั่ง bash ให้ผลลัพธ์นี้:

Runtime Name: vmhba2:C0:T3:L14
Group State: active
Runtime Name: vmhba3:C0:T0:L14
Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14
Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14
Group State: active
Runtime Name: vmhba2:C0:T2:L14
Group State: active

ฉันต้องการส่งไปที่บางสิ่งเพื่อให้มีลักษณะดังนี้:

Runtime Name: vmhba2:C0:T1:L14 Group State: active 
Runtime Name: vmhba3:C0:T3:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T2:L14 Group State: active
[...]

ie ลบ newline อื่น ๆ

ฉันพยายาม... |tr "\nGroup" " "แต่มันก็ลบบรรทัดใหม่ทั้งหมดและกินจดหมายอื่น ๆ ด้วย ขอบคุณ


2
trเป็นตัวอักษรทั้งหมด: คุณขอให้ tr ลบบรรทัดใหม่และ 'G', 'r', 'o', 'u' และ 'p' ทั้งหมด
เกล็นแจ็คแมน

คำตอบ:


80

ไม่สามารถทดสอบได้ในขณะนี้ แต่

... | paste - - 

ควรทำมัน


5
+1 - งานและสง่างาม (มันทำให้แท็บระหว่างบรรทัด - paste -d ' ' - -จะเพิ่มพื้นที่แทนถ้าจำเป็น)
cyberx86

4
คุณช่วยอธิบายคำสั่งได้อย่างไร ทำไมจึงมีสอง-? ขอบคุณ
bbaja42

7
pastepaste file1 file2 file3 ...จะใช้ในการเชื่อมสายที่สอดคล้องกันจากไฟล์: หากหนึ่งในอาร์กิวเมนต์ "ไฟล์" คือ "-" จะมีการอ่านบรรทัดจากอินพุตมาตรฐาน หากมี 2 "-" อาร์กิวเมนต์ให้วางใช้เวลา 2 บรรทัดจาก stdin และอื่น ๆ ดูหน้าคน
เกล็นแจ็คแมน

10

ความเป็นไปได้อย่างหนึ่งคือ:

awk 'ORS=NR%2?" ":"\n"'

หากหมายเลขบรรทัดหารด้วย 2 ให้ลงท้ายด้วยบรรทัดใหม่มิฉะนั้นให้ลงท้ายด้วยเว้นวรรค

(ทดสอบกับ: CentOS 6, GNU Awk 3.1.7)

ใช้ sed (ดูคำอธิบาย ):

sed ':a;N;$!ba;s/\nGroup/ Group/g'

อ่านเพิ่มเติม:


8

หากคุณต้องการใช้sedไม่มีเหตุผลที่จะอ่านไฟล์ทั้งหมดในหน่วยความจำ คุณสามารถรวมบรรทัดอื่น ๆ เช่นนี้ได้:

sed 'N;s/\n/ /' inputfile

ใช้อักขระใด ๆ ที่คุณต้องการแทนช่องว่าง

นี่เป็นอีกวิธีในการใช้ awk:

awk '{printf "%s", $0; if (getline) print " " $0; else printf "\n"}' inputfile

if/elseจับกรณีที่มีเลขคี่ของเส้นในแฟ้ม หากไม่มีบรรทัดสุดท้ายที่แปลกจะถูกพิมพ์สองครั้ง มิฉะนั้นสำหรับการเปรียบเทียบคุณสามารถทำได้:

awk '{printf "%s", $0; getline; print " " $0}'

1
ความคิดเห็นที่ล่าช้า: 1) ใช้ตัวระบุรูปแบบสำหรับ printf เสมอในกรณีที่สตริงมีเครื่องหมายเปอร์เซ็นต์ 2) เพื่อหลีกเลี่ยงบรรทัดสุดท้ายที่ซ้ำกันตั้งค่า $ 0 เป็น "" -awk '{printf "%s", $0; $0=""; getline; print " " $0}'
glenn jackman

3

วิธีสำนวนที่สุดที่จะทำawkมีดังต่อไปนี้

awk 'ORS=NR%2?FS:RS' file

มันเอาท์พุท:

Runtime Name: vmhba2:C0:T3:L14 Group State: active
Runtime Name: vmhba3:C0:T0:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14 Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14 Group State: active
Runtime Name: vmhba2:C0:T2:L14 Group State: active

เพื่ออธิบายเราจำเป็นต้องกำหนดตัวแปรในตัวแต่ละตัว:

  • RSคั่นบันทึก เริ่มต้นที่\n(บรรทัดใหม่)
  • ORSตัวแยกเร็กคอร์ดเอาต์พุต เริ่มต้นที่\n(บรรทัดใหม่)
  • FSตัวคั่นฟิลด์ เริ่มต้นที่(ช่องว่าง)
  • NR จำนวนบันทึก

เนื่องจากตัวคั่นเร็กคอร์ดดีฟอลต์คือบรรทัดใหม่เร็กคอร์ดจึงเป็นบรรทัด

NR%2เป็นโมดูลัสของNR/2เพื่อที่ว่ามันจะเป็นอย่างใดอย่างหนึ่งหรือ0 สำหรับเส้นคู่และสำหรับเส้นคี่101

var=condition?condition_if_true:condition_if_false เป็นผู้ประกอบการที่สาม

ทั้งหมดเข้าด้วยกันบอกว่าORS=NR%2?FS:RSเรากำลังกำหนดตัวแยกเร็กคอร์ดเอาท์พุท:

  • ถ้าจำนวนของเร็กคอร์ดอยู่บนฟอร์ม2k + 1นั่นคือบนบรรทัดคู่ตัวคั่นเร็กคอร์ดเอาต์พุตถูกตั้งค่าเป็นFSนั่นคือช่องว่าง
  • หากจำนวนเร็กคอร์ดอยู่บนฟอร์ม2kนั่นคือบนบรรทัดคี่จากนั้นตัวคั่นเร็กคอร์ดเอาต์พุตถูกตั้งค่าเป็นRSนั่นคือบรรทัดใหม่

ด้วยวิธีนี้เส้นคี่ลงท้ายด้วยช่องว่างจากนั้นจะรวมกับบรรทัดถัดไป หลังจากบรรทัดนั้นบรรทัดใหม่จะถูกพิมพ์

ข้อมูลอื่น ๆ ในawk สำนวน


2

สิ่งนี้ใช้ได้กับฉันบน Linux:

... | tr "\\n" " "

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


สิ่งนี้จะลบบรรทัดใหม่ทุกบรรทัดไม่ใช่บรรทัดใหม่อื่น ๆ
Trenton


1

ถ้า Perl เป็นตัวเลือก:

perl -pe 's/\n/ / if $. % 2 == 1' file

s/\n/ /แทนที่ newline ด้วยช่องว่าง
$.คือหมายเลขบรรทัด


-1

วิธีการเกี่ยวกับการใช้งานgrep?

.. | grep -v '^Group State'

ที่กำจัดเส้นอื่น OP ต้องการให้ผนวกเข้าด้วยกัน
Dennis Williamson

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