ฉันต้องการพิมพ์คอลัมน์หรือฟิลด์สุดท้ายที่สองใน awk จำนวนฟิลด์เป็นตัวแปร ฉันรู้ว่าฉันควรใช้งาน$NF
ได้ แต่ไม่แน่ใจว่าจะใช้งานได้อย่างไร
และนี่ดูเหมือนจะไม่ทำงาน:
awk ' { print ( $NF-- ) } '
ฉันต้องการพิมพ์คอลัมน์หรือฟิลด์สุดท้ายที่สองใน awk จำนวนฟิลด์เป็นตัวแปร ฉันรู้ว่าฉันควรใช้งาน$NF
ได้ แต่ไม่แน่ใจว่าจะใช้งานได้อย่างไร
และนี่ดูเหมือนจะไม่ทำงาน:
awk ' { print ( $NF-- ) } '
คำตอบ:
awk '{print $(NF-1)}'
ควรทำงาน
awk -F '.' '{print $(NF-2)}'
$(..)
เรียกใช้คำสั่งในเชลล์ย่อยซึ่งขึ้นอยู่กับเชลล์ที่คุณใช้ คุณสามารถทำงานรอบนี้โดยใช้แทน$ (NF-1)
$(NF-1)
คำตอบที่ยอมรับของ Chris Kannon น้อยมาก: พิมพ์เฉพาะในกรณีที่มีคอลัมน์สุดท้ายที่สอง
(
echo | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 3 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
)
มันง่ายที่สุด:
awk '{print $--NF}'
เหตุผลที่ต้นฉบับ$NF--
ไม่ทำงานเนื่องจากนิพจน์ได้รับการประเมินก่อนการลดลงในขณะที่การลดค่านำหน้าของฉันจะดำเนินการก่อนการประเมิน
int x = ++i
int x = i++
คำนำหน้าหมายถึงการเพิ่มขึ้นก่อน postfix หมายถึงการเพิ่มขึ้นภายหลัง (การมอบหมายก่อน)
awk ' { print ( $(NF-1) ) }' file
คุณไม่ไกลจากผลลัพธ์! นี่มัน:
awk '{NF--; print $NF}' file
นี้ decrements จำนวนของเขตข้อมูลในหนึ่งเพื่อให้$NF
มีอดีตสุดท้าย
มาสร้างตัวเลขกันบ้างแล้วพิมพ์ลงบนกลุ่มละ 5:
$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12
ลองพิมพ์ penultimate ในแต่ละบรรทัด:
$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11
โซลูชัน Perl คล้ายกับโซลูชัน awk ของ Chris Kannon:
perl -lane 'print $F[$#F-1]' file
ใช้ตัวเลือกบรรทัดคำสั่งเหล่านี้:
n
วนรอบทุกบรรทัดของไฟล์อินพุตอย่าพิมพ์ทุกบรรทัดโดยอัตโนมัติ
l
ลบบรรทัดใหม่ก่อนการประมวลผลและเพิ่มพวกเขากลับมาในภายหลัง
a
โหมด autosplit - แบ่งบรรทัดอินพุตออกเป็น@F
อาร์เรย์ ค่าเริ่มต้นที่จะแยกในช่องว่าง
e
รันรหัส Perl
@F
อาร์เรย์ AutoSplit เริ่มต้นที่ดัชนี [0] ในขณะที่เขต awk เริ่มต้นด้วย $ 1
$#F
คือจำนวนองค์ประกอบใน@F
$F[-2]
คุณพยายามเริ่มจากขวาไปซ้ายโดยใช้คำสั่ง rev หรือไม่ ในกรณีนี้คุณเพียงแค่พิมพ์คอลัมน์ที่ 2:
seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev
4
9
11
ลดค่าแรกแล้วพิมพ์ -
awk ' { print $(--NF)}' file
หรือ
rev file|cut -d ' ' -f2|rev
หากคุณมีคอลัมน์จำนวนมากและต้องการพิมพ์ทั้งหมด แต่ไม่ใช่ทั้งสาม cloumns ในครั้งสุดท้ายสิ่งนี้อาจช่วยได้
awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'
NF
คือดัชนีฟิลด์สุดท้าย$NF
คือค่าของฟิลด์สุดท้าย