จะแยกเฉพาะค่าที่มากกว่าขีด จำกัด จากไฟล์ได้อย่างไร


10

ฉันมีไฟล์นี้:

names average
john:15.02
Mark:09.63
James:12.58

ฉันต้องการแยกเฉพาะค่าเฉลี่ยมากกว่า 10 จากมันดังนั้นผลลัพธ์ในตัวอย่างนี้ควรเป็น:

15.02
12.58

คำตอบ:


19

กับ awk

awk -F: '{if($2>10)print$2}' <filename

คำอธิบาย

  • -F:- ชุดFคั่น ield ไป:
  • {if($2>10)print$2}- สำหรับแต่ละบรรทัดทดสอบว่า2ฟิลด์ครั้งคือ>10ถ้าเป็นเช่นนั้นprintมัน
  • <filename- ปล่อยให้ shell open file filenameดีกว่าปล่อยให้awkทำอย่างนั้นดูคำตอบของStéphane Chazelas ในหัวข้อ

ตัวอย่างการวิ่ง

$ <filename awk -F: '{if($2>10)print$2}'
15.02
12.58

นอกจากนี้ยังเป็นไปได้ที่จะเพิ่มช่องว่างและวางรูปแบบไว้นอกวงเล็บดังนั้นสิ่งเหล่านี้เท่ากัน - ขอบคุณStefanสำหรับการชี้ว่า:

awk -F: '{if($2>10)print$2}' <filename
awk -F: '{ if ( $2 > 10 ) print $2 }' <filename
awk -F: '$2>10{print$2}' <filename
awk -F: '$2 > 10 { print $2 }' <filename

ขอบคุณมากสำหรับความช่วยเหลือของคุณโซลูชั่นที่สมบูรณ์แบบฉันสามารถใช้เฉพาะคำสั่ง 'ตัด' และ 'grep' (คำสั่งพื้นฐาน) ในสถานการณ์นี้เพื่อแสดงจากไฟล์เฉลี่ยเท่านั้นที่เหนือกว่าถึง 10 ..
Haikel Fazzani

ฉันเข้าใจวิธีแก้ปัญหาของคุณสมบูรณ์แบบขอบคุณมากสำหรับความช่วยเหลือฉันซาบซึ้งทุกความพยายามของคุณ ..
Haikel Fazzani

อย่าลืมว่าทุบตีจะถือว่า[[ $0 > 10 ]]เป็นการเปรียบเทียบคำศัพท์ - และในกรณีใด ๆ ไม่ได้ช่วยอะไรมากสำหรับค่าที่ไม่ใช่จำนวนเต็ม
steeldriver

@dessert: โดยส่วนตัวแล้วฉันชอบที่จะวางรูปแบบไว้ก่อนข้อความการกระทำเช่น: awk -F: '$ 2> 10 {พิมพ์ $ 2}' เพราะมันดูเป็นระเบียบเรียบร้อยสำหรับฉันและง่ายต่อการขยาย (เช่น $ 2> 10 && $ 2 <100) .
Stefan

3

ด้วย grep คุณต้องทำงานกับนิพจน์ทั่วไป เช่น

grep -E ':[^0-9]*[1-9][0-9][0-9]*\.' file | cut -d':' -f2

เช่นเดียวกับ sed:

sed -n 's/.*:[^0-9]*\([1-9][0-9][0-9]*\..*\)/\1/p' file

แต่การใช้ RegEx กับข้อมูลที่สั่งนั้นมีแนวโน้มที่จะเกิดข้อผิดพลาด (จากประสบการณ์ของฉัน) และอ่านยาก ;-)


ฉลาดมาก! สามารถลงไปและgrep ':[1-9][0-9]\+\.' <file | cut -d: -f2 sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <fileเป็นมูลค่าการกล่าวขวัญว่าการทำงานกับ> 1,> 10,> 100 ฯลฯ เท่านั้นเช่น> 20 จะเป็นไปไม่ได้
ของหวาน

ฉันพบข้อบกพร่องใน RegEx ของฉัน: สำหรับตัวเลขที่ไม่มีจุดทศนิยมที่ RegEx ต้องเป็น: ':[1-9][0-9]\+\.\?'- จุดทศนิยมตามตัวอักษร \ เป็นตัวเลือกและจับคู่กันมากที่สุด \? (@dessert ขอบคุณที่ชี้ข้อ จำกัด ของ RegEx ของฉัน)
Stefan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.