วิธีการจัดกลุ่มบรรทัดในไฟล์สอง?


9

ฉันมีไฟล์ข้อความดังนี้:

a
b
c
d
e
f
g

ฉันจะจัดกลุ่มบรรทัดเหล่านั้นเพื่อรับเอาต์พุตดังนี้:

a-b
b-c
c-d
d-e
e-f
f-g

ฉันต้องทำสิ่งนี้ในเปลือก (sh, csh, bash)

ฉันได้พบสิ่งนี้:

cat file | xargs -n2

แต่องค์ประกอบสุดท้ายของกลุ่มแรกไม่ได้กลายเป็นองค์ประกอบแรกของกลุ่มที่สอง

คำตอบ:


9

ด้วยawk:

awk 'NR!=1{print x"-"$0}{x=$0}' file
  • NR!=1 ใช้กับทุกบรรทัดยกเว้นอันแรก
  • print x"-"$0 พิมพ์ค่าด้วยเส้นประระหว่าง
  • x=$0set x(สำหรับการทำซ้ำครั้งถัดไป)

5

ด้วย POSIX sed:

sed '1{
  h
  d
}
H
x
s/\n/-/
' <file

หรือรุ่นหนึ่งซับ:

sed -e '1{h;d' -e\} -e 'H;x;s/\n/-/' <file

ฉันต้องการตัวอักษรตัวแรกของบรรทัดที่สองที่จะเป็นตัวสุดท้ายในบรรทัดแรก ...
Costel Balta-Coman

การใช้พื้นที่ถือดี
สัญลักษณ์แทน

ใช่มันดี
mikeserv

คุณอธิบายได้ไหมว่ามันทำงานอย่างไร
Yossarian

5
paste -d- - ./infile <infile

^ นั่นจะทำงานได้ดีจริงๆยกเว้นว่าการป้อนข้อมูลของคุณจะไม่เป็นรายคน ดังนั้น...

{ echo; cat <infile; } | paste -d- - ./infile | sed '1d;$d'

... ใช้ได้ แต่อาจซับซ้อนเกินไป ...


นั่นคือสิ่งเดียวกันที่เข้ามาในใจของฉันในตอนแรกหลังจากอ่านข้อกำหนดของ OP ผิดพลาด แต่ฉันตัดสินใจที่จะปล่อยให้sedทำตามลำพัง
cuonglm

@cuonglm - ฉันอ่านผิดหรือเปล่า?
mikeserv

1
ไม่ฉันพนันได้เลย แต่คุณต้องsed 1d\;\$dแก้ไขให้ถูกต้อง
cuonglm

แล้วตัวแปรนี้ล่ะ? sed '2~2p' infile | paste -d- - -
ขับเหล็ก

1
ตอนนี้ฉันเห็นแล้ว paste -d- <(head -n -1 input) <(tail -n +2 input)
Costas

2

อีกหนึ่ง sed

sed '$!N;s/\n/-/p;s/-/\n/;D' <input

และสามารถแก้ไขได้ (ต้องขอบคุณmikeserv ):

sed -n 'N;y/\n/-/;P;y/-/\n/;D' <input

1
y/-\n/\n-/สามารถแทนที่ทั้ง s /// บางที ถ้าทำได้จะเร็วกว่าพกพาสำหรับการใช้งาน \ n และสั้นกว่า
mikeserv

1

รุ่นทุบตีบริสุทธิ์ -

old=""; while read -r line ; do [[ -n "$old" ]] && echo   $old-$line;   old=$line; done  < input

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