มีวิธีใดที่จะทำให้คำสั่ง cut อ่านฟิลด์สุดท้ายเท่านั้น?


13

ฉันมีสตริงแยกช่องว่างซึ่งเป็นผลลัพธ์โดยคำสั่งที่ฉันชอบไปป์ไลน์cutใช้-fd ' 'เพื่อแยกช่องว่าง ฉันรู้ว่าฉันสามารถใช้-f <n>เพื่อแสดงหมายเลขฟิลด์ได้<n>แต่ฉันสามารถทำให้มันแสดงฟิลด์สุดท้ายได้หรือไม่หากฉันไม่ทราบความยาวของสตริง

หรือฉันต้องใช้เครื่องมือแก้ไขข้อความที่มีความยืดหยุ่นมากกว่านี้เช่นsedหรือawk?


ฉันคิดว่าคำสั่ง cut ไม่สามารถรองรับได้ แต่ไม่แน่ใจคุณลองใช้ cut -d '' -f- หรือยัง?
αғsнιη

3
วิธีเพิ่มเติมในการทำเช่น: stackoverflow.com/questions/22727107/…
edwinksl

@KasiyA -nทำให้เป็น n ตั้งแต่เริ่มต้นn-มาจาก n ถึงจุดสิ้นสุดและมี--complementตัวเลือกที่จะยกเลิกการเลือก แต่ไม่มีวิธีที่จะนับจำนวนของเขตข้อมูลและดำเนินการกับมันเท่าที่ฉันสามารถบอกได้
Arronical

คำตอบ:


13

ไม่มีcutไม่สามารถทำเช่นนั้น คุณสามารถใช้สองrevคำสั่งเช่น

echo 'foo bar baz' | rev | cut -d' ' -f1 | rev

แต่มักจะใช้ง่ายกว่าawk:

echo 'foo bar baz' | awk '{print $(NF)}'

7

คุณสามารถทำได้โดยใช้เชลล์เท่านั้นไม่จำเป็นต้องใช้เครื่องมือภายนอกโดยใช้การขยายพารามิเตอร์:

${var##* }

var##*จะทิ้งทุกอย่างจากการเริ่มต้นขึ้นไปยังพื้นที่ที่ผ่านมาจากพารามิเตอร์ var(ตัวแปร)

หากตัวคั่นสามารถเป็นช่องว่างใด ๆ เช่นช่องว่างหรือแท็บใช้คลาสตัวอักษร[:blank:]:

${var##*[[:blank:]]}

ตัวอย่าง:

$ var='foo bar spam egg'

$ echo "${var##* }"
egg


$ var=$'foo\tbar\tspam\tegg'

$ echo "$var"
foo    bar    spam    egg

$ echo "${var##*[[:blank:]]}"
egg

ฉันพูดเกี่ยวกับการใช้การขยายพารามิเตอร์ในความคิดเห็นเกี่ยวกับคำตอบของ Severus Tux แต่คลาสอักขระว่างเปล่าเป็นข้อมูลที่มีประโยชน์ขอบคุณ
Arronical

4

ฉันชอบคำตอบของ Florian Diesch เป็นการส่วนตัว แต่มีวิธีนี้เช่นกัน

a=$(echo "your string here" | wc -w)
echo "your string here" | cut -d' ' -f$a

คำอธิบาย:

wc -wให้จำนวนคำ และcutตัดคำสุดท้าย

แก้ไข:

ฉันคิดอีกวิธีในการทำ:

echo "Any random string here" | tac -s' ' | head -1

ถูกต้อง แต่สิ่งนี้เป็นจริงเมื่อ delim เป็นช่องว่างหรือแท็บและหาก delim ของคุณไม่เหมือนกันสิ่งนี้จะล้มเหลว
αғsнιη

คิดข้างดี แต่ถ้าฉันตั้งค่าa="my string here"ฉันสามารถใช้การขยายพารามิเตอร์${a##* }ด้วย
59

1
ใช่ แต่ OP บอกว่าเขามีสตริงคั่นด้วยช่องว่าง
Severus Tux

2

นี่คือหนึ่งในการใช้ grep

$ echo "Change is Good" | grep -o '[^ ]*$'
Good

มันทำงานอย่างไร:

  • grep พร้อม-oพิมพ์เฉพาะส่วนที่จับคู่ (ไม่ว่าง) ของบรรทัดที่ตรงกัน
  • regexp [^ ]*$จับคู่อะไรตั้งแต่ต้นจนพบที่ว่าง

อีกหนึ่งซับจากเกล็นแจ็คแมนใช้ Perl

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.