ค้นหาค่าสูงสุดของคอลัมน์ 1 และพิมพ์ระเบียนที่เกี่ยวข้องจากคอลัมน์ 2 จากไฟล์


19

วิธีค้นหาค่าสูงสุดจากคอลัมน์ 1 และ echo ตำแหน่งพา ธ ตามลำดับจากไฟล์ที่มีจำนวนเรคคอร์ด

$ cat version.log
112030  /opt/oracle/app/oracle/product/11.2.0
121010  /opt/oracle/app/oracle/product/12.1.0

ผลลัพธ์ที่คาดหวัง:

/opt/oracle/app/oracle/product/12.1.0

คำตอบ:


23

สิ่งนี้น่าจะใช้ได้:

awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} ' version.log

-v max=0ชุดตัวแปรmaxไปแล้วสำหรับแต่ละบรรทัดฟิลด์แรกเมื่อเทียบกับมูลค่าปัจจุบันของ0 maxหากมีค่ามากกว่าให้maxตั้งค่าเป็นฟิลด์ 1 และwantตั้งค่าเป็นบรรทัดปัจจุบัน เมื่อโปรแกรมประมวลผลไฟล์ทั้งหมดค่าปัจจุบันของwantจะถูกพิมพ์

แก้ไข

ฉันไม่ได้ทดสอบawkวิธีแก้ปัญหาก่อนหน้านี้และมันก็แย่มากที่ฉันจะให้มัน อย่างไรก็ตามรุ่นที่แก้ไขของคำตอบควรทำงาน (ขอบคุณ terdon สำหรับการแก้ไข) และฉันทดสอบด้านล่างเช่นกัน

sort -nrk1,1 filename | head -1 | cut -d ' ' -f3

ฉันกำลังเข้าไปsortในสนามแรกที่

  • -n ระบุการเรียงลำดับตัวเลข
  • -r ระบุย้อนกลับผลการจัดเรียง
  • -k1,1 ระบุฟิลด์แรกสำหรับการเรียงลำดับที่จะเกิดขึ้น

ทีนี้หลังจากการเรียงลำดับฉันกำลังไพพ์เอาต์พุตและเพิ่งได้รับผลลัพธ์แรกซึ่งจะให้ค่าคอลัมน์ที่ 1 สูงสุดในผลลัพธ์

ตอนนี้ฉันก็ไปป์cutกับตัวคั่นที่ระบุเป็นช่องว่างและการพิมพ์-f3ซึ่งเป็นผลลัพธ์ที่ต้องการ

การทดสอบ

cat filename
112030   /opt/oracle/app/oracle/product/11.2.0
121010   /opt/oracle/app/oracle/product/12.1.0
2312     /hello/some/other/path
3423232  /this/is/really/big/number
342      /ok/not/the/maximum/number
9999899  /Max/number
9767     /average/number

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

/Max/number

awk max ไม่ได้เปรียบเทียบฟิลด์สตริงเป็นตัวเลข ทำไมคุณถึงให้แนวทางที่สอง?
Sajuuk

7

AWKคุณสามารถทำมันได้ด้วย

$ awk '{if(max<$1){max=$1;line=$2}}END{print line}' file 
/opt/oracle/app/oracle/product/12.1.0

ที่นี่คอลัมน์แรกของแต่ละบรรทัดจะถูกเปรียบเทียบกับตัวแปรmax(ซึ่งเริ่มต้นที่ 0) หากคอลัมน์แรกมีค่า greated maxดังนั้นคอลัมน์ที่สองจะถูกเก็บไว้ในตัวแปรlineการดำเนินการนี้จะดำเนินต่อไปสำหรับแต่ละบรรทัดของไฟล์

ในตอนท้ายของENDกฎไฟล์จะถูกดำเนินการเพื่อพิมพ์lineตัวแปร



3

sort -k1 -n filename | tail -1 | awk '{print $2}'


1
สิ่งนี้ควรใช้งานได้ แต่ไม่มีประสิทธิภาพเนื่องจากการเรียงลำดับนั้นมากเกินไปเมื่อภารกิจต้องค้นหาค่าสูงสุด
jw013

2

เพียงคุณสามารถจัดเรียงได้โดยใช้sortคำสั่ง

sort -r version.log | head -n1 | awk '{print $2}'

เอาท์พุท:

/opt/oracle/app/oracle/product/12.1.0

คุณต้องการพิมพ์ค่าที่สองให้ลองใช้ cat version.log | เรียง -r | หัว -n1 | awk -F "" '{พิมพ์ $ 2}'
Security Beast

โปรดอย่าโพสต์ภาพหน้าจอของเทอร์มินัลของคุณ เพียงวางข้อความแทน นอกจากนี้ยังไม่จำเป็นต้องมีการcatเรียงลำดับสามารถใช้ไฟล์อินพุตโดยตรง
terdon

-2
sort -nrk1,1 version.log | head -1 |awk '{print $2}’

2
ดูเหมือนว่าคำตอบที่ยอมรับแล้วซ้ำอีกครั้งหรือไม่ โปรดอธิบายความแตกต่าง
สตีเฟ่น Rauch

อย่างน้อยที่สุดก็ให้เครดิตกับผู้เขียนต้นฉบับ
Jeff Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.