ตัวอย่างเช่นcut
คำสั่งสามารถใช้พารามิเตอร์ -f ซึ่งเป็นไปตามman
เลือกเฉพาะฟิลด์เหล่านี้ พิมพ์บรรทัดใด ๆ ที่ไม่มีอักขระตัวคั่นยกเว้นระบุ -s ตัวเลือก
ในบริบทนี้เขตข้อมูลคืออะไร
ตัวอย่างเช่นcut
คำสั่งสามารถใช้พารามิเตอร์ -f ซึ่งเป็นไปตามman
เลือกเฉพาะฟิลด์เหล่านี้ พิมพ์บรรทัดใด ๆ ที่ไม่มีอักขระตัวคั่นยกเว้นระบุ -s ตัวเลือก
ในบริบทนี้เขตข้อมูลคืออะไร
คำตอบ:
ฟิลด์ "" ระยะมักจะเป็นครั้งที่เกี่ยวข้องกับเครื่องมือเช่นและcut
awk
เขตข้อมูลจะคล้ายกับคอลัมน์ที่มีมูลค่าของข้อมูลหากคุณใช้ข้อมูลและแยกออกโดยใช้อักขระเฉพาะ โดยทั่วไปตัวละครที่ใช้ทำสิ่งนี้คือSpaceโดยปกติตัวอักษรที่ใช้ในการทำเช่นนี้เป็น
อย่างไรก็ตามเป็นกรณีที่มีเครื่องมือส่วนใหญ่ก็สามารถกำหนดค่าได้ ตัวอย่างเช่น:
awk -F"," ...
- คั่นด้วยเครื่องหมายจุลภาค (เช่น, )cut -d"," ...
- จะคั่นด้วยเครื่องหมายจุลภาค (เช่น,)อันแรกนี้แสดงให้เห็นว่าawk
จะแบ่งช่องว่างโดยอัตโนมัติอย่างไร
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
อันนี้แสดงให้เห็นว่าcut
จะแยกช่องว่างได้อย่างไร
$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
ที่นี่เรามีรายการคอลัมน์ข้อมูล CSV ที่เราใช้cut
เพื่อส่งคืนคอลัมน์ 1 และ 4
$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4
Awk ก็สามารถทำได้เช่นกัน:
$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4
Awk ยังเก่งกว่าเล็กน้อยในการรับมือกับตัวละครแยกต่าง ๆ นี่ก็จัดการกับTabsพร้อมกับSpacesที่พวกเขากำลังผสมระหว่างในเวลาเดียวกัน:
$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.
ด้วยความเคารพต่อสวิตช์นี้มันเพียงแค่บอกว่าcut
จะไม่พิมพ์บรรทัดใด ๆ ที่ไม่มีอักขระตัวคั่นที่ระบุผ่าน-d
สวิตช์
สมมติว่าเรามีไฟล์นี้
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
หมายเหตุ:มีช่องว่างและแท็บในสตริงที่ 2 ด้านบน
ตอนนี้เมื่อเราดำเนินการเหล่านี้โดยใช้สายcut
ที่มีและไม่มี-s
สวิทช์:
$ cut -d" " -f1-6 sample.txt
This is a space string.
This is a space
Thisstringcontainsneither.
$ cut -d" " -f1-6 -s sample.txt
This is a space string.
This is a space
ในตัวอย่างที่ 2 คุณจะเห็นว่า-s
สวิทช์ได้ละเว้นสตริงใด ๆ Spaceจากการส่งออกที่ไม่ได้มีตัวคั่น,
เขตข้อมูลตาม POSIX เป็นส่วนหนึ่งของบรรทัดใด ๆ ที่คั่นด้วยอักขระใด ๆ ในIFS
" ตัวคั่นเขตข้อมูลอินพุต (หรือตัวคั่นเขตข้อมูลภายใน ) " ค่าเริ่มต้นของพื้นที่นี้คือพื้นที่ตามด้วยตัวสร้างแนวนอนตามด้วย newline . ด้วย Bash คุณสามารถเรียกใช้printf '%q\n' "$IFS"
เพื่อดูค่าของมัน
cut
ซึ่งเป็นคำถามที่ถาม
cut -d "$IFS"
จะเกิดข้อผิดพลาดในขณะที่awk -F"[ \t\n]"
ทำงานตามที่คาดไว้
มันขึ้นอยู่กับยูทิลิตี้ที่เป็นปัญหา แต่สำหรับcut
"ฟิลด์" เริ่มต้นที่จุดเริ่มต้นของบรรทัดข้อความและรวมทุกอย่างจนถึงแท็บแรก เขตข้อมูลที่สองเรียกใช้จากอักขระหลังจากแท็บแรกจนถึงแท็บถัดไป และสำหรับลำดับที่สามสี่ ... ทุกอย่างระหว่างแท็บหรือระหว่างจุดเริ่มต้นและแท็บหรือระหว่างแท็บและจุดสิ้นสุดของบรรทัด
ยกเว้นว่าคุณระบุตัวคั่นฟิลด์ด้วยตัวเลือก "-d": cut -d: -f2
คุณจะได้รับทุกอย่างระหว่างอักขระโคลอนแรกและโคลอนที่สอง (':')
โปรแกรมอรรถประโยชน์อื่น ๆ มีคำจำกัดความที่แตกต่างกัน แต่แท็บอักขระทั่วไป awk
เป็นการถอยกลับที่ดีหากcut
เข้มงวดเกินไปเนื่องจากawk
แบ่งเขตข้อมูลตามอักขระช่องว่างอย่างน้อยหนึ่งตัว นั่นเป็นเรื่องที่ค่อนข้างเป็นธรรมชาติมากขึ้นในหลาย ๆ สถานการณ์ แต่คุณต้องรู้จักไวยากรณ์บ้างเล็กน้อย หากต้องการพิมพ์ฟิลด์ที่สองตามawk
:
awk '{print $2}'
sort
เป็นคนที่หลอกฉัน sort
หน้าคนปัจจุบันของฉันพูดบางอย่างเช่น "การไม่เปลี่ยนเป็นว่างเปล่า" สำหรับตัวคั่นฟิลด์ ด้วยเหตุผลบางอย่างการพยายามsort
กำหนดเขตข้อมูลอย่างถูกต้องใช้เวลาสักครู่join
เห็นได้ชัดว่าใช้เขตข้อมูล "คั่นด้วยช่องว่าง" ซึ่งเป็นสิ่งที่awk
อ้างว่าทำตามค่าเริ่มต้น
คุณธรรมของเรื่องคือต้องระวังและทดลองถ้าคุณไม่รู้
คำว่า "field" ไม่เกี่ยวข้องกับ linux โดยทั่วไป แต่สำหรับโปรแกรมเฉพาะ ดังนั้นcut
ใช้สนามที่แตกต่างกว่าsort
ใช้ชนิดที่แตกต่างของสนามกว่า
กับ cut
คุณกำหนดว่าฟิลด์ใดเป็นตัวคุณเองโดยระบุตัวคั่นฟิลด์ด้วยตัวเลือก -d ซึ่งแยกฟิลด์ในแต่ละบรรทัด
หากข้อมูลของคุณถูกคั่นด้วยเครื่องหมายทวิภาคในบรรทัดคุณสามารถรวม-d
และ-f
รับฟิลด์ (หรือคอลัมน์) 2, 3 และ 6 ดังนี้:
echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
เมื่อคุณใช้cut
คำสั่งมันจะใช้เวลาสองข้อโต้แย้งหลัก
-d: ซึ่งย่อมาจากตัวคั่น
-f: ซึ่งย่อมาจากฟิลด์ที่จะถูกตัดออกจากไฟล์อินพุต
Ex. cut - d "|" - f1, 2 input_filename
ที่นี่output
จะคั่นด้วยตัวคั่น "|" และมันจะตัดเพียง 2 ฟิลด์จากไฟล์อินพุต
หากคุณมีบรรทัดต่อไปนี้ในไฟล์ของคุณ
Alex|120000|Admin|1999
จากนั้นมันจะตัด 2 ฟิลด์ซึ่ง ได้แก่
Alex|120000
cut
ดีมากสำหรับกรณีง่าย ๆ ที่ตัวคั่นเป็นอักขระเดียวและคุณต้องการส่งออกชุดย่อยของฟิลด์อินพุตในลำดับเดียวกัน (แม้ว่าฉันจะระบุ-f3,2,1
มันก็ทำหน้าที่เหมือน-f1,2,3
)
awk
หนึ่งเส้นขอบมีความยืดหยุ่นมากขึ้นเช่นเมื่อตัวคั่นเขตข้อมูลอินพุตอาจเป็นช่องว่างใด ๆ ( awk
ค่าเริ่มต้น) หรือเมื่อคุณต้องการที่จะเอาท์พุทเขตข้อมูลในลำดับที่แตกต่างกันหรือในรูปแบบเฉพาะ
ยกตัวอย่างเช่นwc -l myfile | awk '{print $1}'
หรือls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'
มีความเรียบง่ายมาก cut
แต่จะยากที่จะทำอย่างไรกับ
ฉันเห็นด้วยกับผู้โพสต์ก่อนหน้านี้ว่าฟิลด์ / คีย์sort
นั้นยากที่จะคิดออก! เขตข้อมูลในjoin
ดูเหมือนจะทำงานเหมือนกับในcut
แม้ว่าjoin
ตัวเลือกจะผิดได้ง่าย
echo '$IFS' | cat -vet
shell