วิธีตัด (เลือก) ฟิลด์จากการนับบรรทัดข้อความตั้งแต่สิ้นสุด?


32

ฉันรู้วิธีเลือกเขตข้อมูลจากบรรทัดโดยใช้คำสั่ง cut ตัวอย่างเช่นให้ข้อมูลต่อไปนี้:

a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

คำสั่งนี้:

cut -d, -f2 # returns the second field of the input line

ผลตอบแทน:

b
g
l

คำถามของฉัน: ฉันจะเลือกเขตข้อมูลที่สองนับจากท้ายได้อย่างไร ในตัวอย่างก่อนหน้าผลลัพธ์จะเป็น:

d
i
n

คำตอบ:


52

กลับอินพุตก่อนและหลังcutด้วยrev:

<infile rev | cut -d, -f2 | rev

เอาท์พุท:

d
i
n

1
ฉันมีตัวอย่างเล็ก ๆ มากมายในโฟลเดอร์ bin ของฉัน rcut มีไว้สำหรับสิ่งนี้: #! / bin / bash rev | ตัด "$ @" | รอบ
John Allsup

2
มันแย่มากที่ไม่cutสามารถใช้ดัชนีฟิลด์ลบ (เช่น Python)
Keith Devens

10

ลองทำสิ่งนี้ด้วย :

awk -F, '{print $(NF-1)}' file.txt

หรือใช้ :

perl -F, -lane 'print $F[-2]' file.txt

หรือใช้ (ขอบคุณ manatwork):

ruby -F, -lane 'print $F[-2]' file.txt

หรือใช้bash(ขอบคุณ manatwork):

while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt

หรือใช้ :

cat file.txt |
python -c $'import sys\nfor line in sys.stdin:\tprint(line.split(",")[-2])'

1
bashไม่ต้องการการนับคอลัมน์คงที่สำหรับสิ่งนี้: while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt.
จัดการ

1
BTW, การแก้ปัญหาที่สามของคุณยังทำงานถ้าคุณเปลี่ยนด้วยperl ruby
จัดการ

ขอขอบคุณrubyเพิ่มbashแก้ไข
Gilles Quenot

1
หากฟิลด์ที่ 4 อาจเริ่มต้นด้วย-หรือ (ขึ้นอยู่กับสภาพแวดล้อมเชลล์หรือวิธีการรวบรวมเชลล์) อาจมีอักขระเครื่องหมายแบ็กสแลชดังนั้นechoจึงไม่ใช่ตัวเลือก ทำไมคุณต้องแย้งcatEnate file.txtกับอะไรก่อนที่จะให้อาหารมันไปpython!? คุณต้องread -Aแทนread -aในและksh93 zshห้อยเชิงลบทำงานในzshแต่เฉพาะในรุ่นล่าสุดของและksh93 bashในรุ่นที่เก่ากว่าคุณสามารถใช้${d: -2:1}
Stéphane Chazelas

2
@ StephanChazelas ฉันคิดว่าคุณหมายถึง${d[@]: -2:1}ในประโยคสุดท้ายของคุณ
จัดการ

0

ใช้ sed:

sed -E 's/^([^,]*,)*([^,]*)(,[^,]*){1}$/\2/' infile

เอาท์พุท:

d
i
n

คำอธิบาย

  • ([^,]*,)* ตรงกับจำนวนใด ๆ ที่ไม่ใช่เครื่องหมายจุลภาค charecter ตามด้วยเครื่องหมายจุลภาคเช่นจำนวนคอลัมน์ใด ๆ
  • ([^,]*) ตรงกับคอลัมน์
  • (,[^,]*){1}ตรงกับหนึ่งคอลัมน์ในตอนท้ายถ้าคุณเปลี่ยนปริมาณ{1}ให้{2}ตรงกับคอลัมน์ที่สองจากท้าย ฯลฯ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.