ฉันมีไฟล์นี้:
names average
john:15.02
Mark:09.63
James:12.58
ฉันต้องการแยกเฉพาะค่าเฉลี่ยมากกว่า 10 จากมันดังนั้นผลลัพธ์ในตัวอย่างนี้ควรเป็น:
15.02
12.58
ฉันมีไฟล์นี้:
names average
john:15.02
Mark:09.63
James:12.58
ฉันต้องการแยกเฉพาะค่าเฉลี่ยมากกว่า 10 จากมันดังนั้นผลลัพธ์ในตัวอย่างนี้ควรเป็น:
15.02
12.58
คำตอบ:
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
[[ $0 > 10 ]]
เป็นการเปรียบเทียบคำศัพท์ - และในกรณีใด ๆ ไม่ได้ช่วยอะไรมากสำหรับค่าที่ไม่ใช่จำนวนเต็ม
ด้วย 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 จะเป็นไปไม่ได้
':[1-9][0-9]\+\.\?'
- จุดทศนิยมตามตัวอักษร \ เป็นตัวเลือกและจับคู่กันมากที่สุด \? (@dessert ขอบคุณที่ชี้ข้อ จำกัด ของ RegEx ของฉัน)