วิธีการแยกสตริงในสองสตริงย่อยที่มีความยาวเท่ากันโดยใช้ bash


12

ฉันต้องการแยกสตริงออกเป็นสองส่วนและพิมพ์ตามลำดับ ตัวอย่างเช่น:

abcdef

เข้าไป

abc
def

มีวิธีง่าย ๆ ที่จะทำหรือต้องการการประมวลผลสตริง?


คุณมีสตริงที่เข้ามาได้อย่างไร? ตัวแปร? stdin? อื่น ๆ ?
Jeff Schaller

1
ในตัวแปร ไม่เป็นไรเพราะทุกอย่างสามารถใช้งานได้ (อินพุต stdin สามารถใส่ในตัวแปรได้)
Gabriel Diego

มันเป็นเรื่องของประสิทธิภาพโดยเฉพาะอย่างยิ่งถ้ามันเป็นเรื่องใหญ่โต และก็เพื่อความสะดวก
Peter Cordes

คำตอบ:


16

ใช้การขยายพารามิเตอร์และเลขคณิตของเชลล์ :

ตัวแปรครึ่งแรกจะเป็น:

${var:0:${#var}/2}

ตัวแปรครึ่งหลังจะเป็น:

${var:${#var}/2}

ดังนั้นคุณสามารถใช้:

printf '%s\n' "${var:0:${#var}/2}" "${var:${#var}/2}"

คุณสามารถใช้คำสั่ง awk ต่อไปนี้:

awk 'BEGIN{FS=""}{for(i=1;i<=NF/2;i++)printf $i}{printf "\n"}{for(i=NF/2+1;i<=NF;i++){printf $i}{printf "\n"}}'

$ echo abcdef | awk 'BEGIN{FS=""}{for(i=1;i<=NF/2;i++)printf $i}{printf "\n"}{for(i=NF/2+1;i<=NF;i++){printf $i}{printf "\n"}}'
abc
def

ขอบคุณสำหรับคำตอบ!
Gabriel Diego

โซลูชั่นที่รัดกุมและสง่างาม
Dudi Boy

3
คุณสามารถกำจัด$((...)); offและlenเป็นส่วนหนึ่งของ${var:off:len}การทดแทนจะมีการประเมินแล้วเป็นนิพจน์ทางคณิตศาสตร์ ตัวอย่าง: foo=01234567; echo "${foo:0:${#foo}/2} ${foo:${#foo}/2}". นั่นเป็นเอกสารและมันก็เหมือนกันzshและksh93ในทุบตี
mosvy

3
หมายเหตุ: หากความยาวของสตริงคี่นี้จะยังคงแยกออกเป็นสองส่วน แต่ที่สองจะเป็นตัวละครอีกต่อไป
peterh - Reinstate Monica


7

awkสคริปต์อื่นสามารถ:

echo abcdef | awk '{print substr($0,1,length/2); print substr($0,length/2+1)}'

1
โปรดทราบว่ามันไม่ได้ทำงานกับ mawk หรือ busybox awk เพราะความกำกวมทางไวยากรณ์ของการหาร/และ/ERE/โอเปอเรเตอร์และกรณีพิเศษของ ()การเป็นทางเลือกสำหรับlength(การใช้งานเหล่านั้นยังไม่สอดคล้องกับ POSIX ในกรณีนั้น) การใช้length()หรือlength($0)ที่นี่แทนที่จะlengthช่วยพวกเขา คุณสามารถทำเช่นนี้awk 'BEGIN{half = int(length(ARGV[1]) / 2); print substr(ARGV[1], 1, half) ORS substr(ARGV[1], half+1)}' abcdefซึ่งจะบันทึกไปป์และกระบวนการพิเศษและทำให้มันทำงานแม้ว่าสตริงมีอักขระขึ้นบรรทัดใหม่
Stéphane Chazelas

1

Python 3

s = input()  # Take one line of input from stdin.
x = len(s) // 2  # Get middle of string. "//" is floor division
print(s[:x], s[x:], sep="\n")  # Print "s" up to "x", then "s" past "x", joined on newlines.

ตัวอย่างเช่น,

$ echo abcdef | python3 -c 's = input(); x = len(s) // 2; print(s[:x], s[x:], sep="\n")'
abc
def

หากความยาวสตริงไม่ใช่เลขคู่บรรทัดที่สองจะยาวขึ้น เช่น

$ echo abcdefg | python3 -c 's = input(); x= len(s) // 2; print(s[:x], s[x:], sep="\n")'
abc
defg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.