ฉันกำลังเจอไฟล์ 4 คอลัมน์ขนาดใหญ่ ฉันต้องการแสดงไฟล์เรียงลำดับใน stdout ตามคอลัมน์ที่ 3:
cat myFile | sort -u -k3
นั่นก็เพียงพอแล้วที่จะทำการหลอกลวง?
sort -u -k3 myFile
แม้
ฉันกำลังเจอไฟล์ 4 คอลัมน์ขนาดใหญ่ ฉันต้องการแสดงไฟล์เรียงลำดับใน stdout ตามคอลัมน์ที่ 3:
cat myFile | sort -u -k3
นั่นก็เพียงพอแล้วที่จะทำการหลอกลวง?
sort -u -k3 myFile
แม้
คำตอบ:
sort -k 3,3 myFile
จะแสดงแฟ้มเรียงตาม 3 ถคอลัมน์สมมติคอลัมน์ที่แยกจากกันโดยลำดับของช่องว่าง (SPC ASCII และอักขระแท็บในสถานที่ POSIX / C) ตามลำดับการจัดเรียงที่กำหนดโดยสถานที่ปัจจุบัน
โปรดทราบว่าช่องว่างนำหน้าจะรวมอยู่ในคอลัมน์ (ตัวคั่นเริ่มต้นคือการเปลี่ยนจากแบบไม่ว่างเปล่าไปเป็นช่องว่าง) ซึ่งสามารถสร้างความแตกต่างในตำแหน่งที่ตั้งที่ไม่มีการละเว้นช่องว่างเพื่อจุดประสงค์ในการเปรียบเทียบใช้-b
ตัวเลือกเพื่อละเว้น ช่องว่างชั้นนำ
โปรดทราบว่ามันเป็นอิสระอย่างสมบูรณ์จากเปลือก (เปลือกทั้งหมดจะแยกบรรทัดคำสั่งที่เหมือนกันโดยทั่วไปเปลือกไม่ได้มีsort
คำสั่งในตัว)
-k 3
คือการเรียงลำดับในส่วนของเส้นที่เริ่มต้นด้วย 3 ถคอลัมน์ (รวมถึงช่องว่างชั้นนำ) ในโลแคล C เนื่องจากอักขระช่องว่างและแท็บจัดอันดับก่อนอักขระที่พิมพ์ได้ทั้งหมดซึ่งโดยทั่วไปจะให้ผลลัพธ์แบบเดียวกันกับคุณ-k 3,3
(ยกเว้นสำหรับบรรทัดที่มีฟิลด์ที่สามเหมือนกัน)
-u
คือการรักษาเพียงหนึ่งในบรรทัดหากมีหลายเรียงที่เหมือนกัน (นั่นคือที่ที่เรียงลำดับเรียงลำดับเดียวกัน (ที่ไม่จำเป็นต้องเหมือนกันเท่ากับเท่ากัน ))
cat
เป็นคำสั่งให้ con cat enate คุณไม่ต้องการที่นี่
หากคอลัมน์ถูกคั่นด้วยอย่างอื่นคุณต้องมี-t
ตัวเลือกเพื่อระบุตัวคั่น
รับไฟล์ตัวอย่าง a
$ cat a
a c c c
a b ca d
a b c e
a b c d
ด้วย-u -k 3
:
$ echo $LANG
en_GB.UTF-8
$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b c e
บรรทัดที่ 2 และ 3 มีคอลัมน์ที่สามเหมือนกัน แต่ที่นี่คีย์การเรียงลำดับคือจากคอลัมน์ที่สามไปยังจุดสิ้นสุดของบรรทัดดังนั้น-u
คงไว้ซึ่งทั้งคู่ ␠ca␠d
ทุกประเภทก่อน␠c␠c
เพราะช่องว่างที่ถูกละเลยในครั้งแรกผ่านในสถานที่ของฉันทุกประเภทก่อนcad
cc
$ sort -u -k 3,3 a
a b c d
a b c e
a b ca d
␠c
ดังกล่าวข้างต้นเพียงหนึ่งจะถูกเก็บไว้สำหรับผู้ที่คอลัมน์ที่ 3 โปรดทราบว่า␠␠c
จะรักษาพื้นที่ที่มี(ช่องว่างนำหน้า 2) ไว้อย่างไร
$ sort -k 3 a
a b ca d
a c c c
a b c d
a b c e
$ sort -k 3,3 a
a b c d
a c c c
a b c e
a b ca d
ดูว่าคำสั่งซื้อa b c d
และการa c c c
กลับรายการเป็นอย่างไร ในกรณีแรกเนื่องจาก␠c␠c
เรียงลำดับก่อนหน้า␠c␠d
ในกรณีที่สองเนื่องจากคีย์การเรียงลำดับเหมือนกัน ( ␠c
) การเปรียบเทียบวิธีสุดท้ายที่เปรียบเทียบบรรทัดในการใส่แบบเต็มa b c d
ก่อนหน้าa c c c
นี้
$ sort -b -k 3,3 a
a b c d
a b c e
a c c c
a b ca d
เมื่อเราเพิกเฉยช่องว่างคีย์การเรียงลำดับสำหรับ 3 บรรทัดแรกจะเหมือนกัน ( c
) ดังนั้นพวกเขาจึงถูกจัดเรียงตามการเปรียบเทียบทางเลือกสุดท้าย
$ LC_ALL=C sort -k 3 a
a b c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b c e
a b c d
a c c c
a b ca d
ในโลแคล C ␠␠c
เรียงลำดับก่อนหน้า␠c
เนื่องจากมีการส่งผ่านเพียงครั้งเดียวโดยที่อักขระ (จากนั้นไบต์เดียว) จะเรียงลำดับตามค่ารหัสจุด (พื้นที่ที่มีจุดรหัสต่ำกว่าc
)
blank
แยกที่อาจรวมถึงตัวละครอื่น ๆ นอกเหนือจากพื้นที่และแท็บขึ้นอยู่กับสถานที่
3,3
ทำ? ทำไมไม่เพียง3
?
หากคุณเข้าใจ "คอลัมน์" เช่นเดียวกับในไฟล์ข้อความ (อักขระที่ 4) ใช่แล้วโซลูชันของคุณควรใช้งานได้ (หรือแม้กระทั่งsort -u -k3 myFile
อนุญาตให้sort
ใช้เวทมนต์หน่วยความจำที่มีการเข้าถึงแบบสุ่ม) หากคุณเข้าใจ "คอลัมน์" ในฐานข้อมูล - เอนทิตีทั้งหมดของข้อมูลตามด้วยตัวคั่นและความกว้างของคอลัมน์ตัวแปรคุณจะต้องมีสิ่งที่ชื่นชอบเช่นนี้ ls -l ตามขนาด
ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
(ซึ่งเทียบเท่ากับเรื่องเล็กน้อยls -lS
แต่เป็นตัวอย่างที่ดี)
sort -k 1.3,1.3
ไวยากรณ์จะเป็น: ls -l | sort -k5,5n
เพื่อเรียงตามขนาด
awk
ตอบคือสิ่งที่ฉันต้องการ
sort -g -k column_number
เป็นคำสั่งด้านขวาเพื่อเรียงลำดับรายการใด ๆ ที่มีอักขระตัวเลขโดยใช้คอลัมน์เฉพาะ
$ sort -k 1.3,1.3 myfile
จะเรียงลำดับไฟล์ myfile ของคุณในคอลัมน์ที่สามหากไฟล์ของคุณไม่มีตัวคั่น
$ cat myfile
ax5aa
aa3ya
fg7ds
pp0dd
aa1bb
$ sort -k 1.3,1.3 myfile
pp0dd
aa1bb
aa3ya
ax5aa
fg7ds
หน้าแรกของการจัดเรียง:
[... ] -k, --key = POS1 [, POS2] เริ่มต้นคีย์ที่ POS1 (จุดเริ่มต้น 1) จบที่ POS2 (เริ่มต้นบรรทัดสุดท้าย) [... ] POS คือ F [.C] [ OPTS] โดยที่ F คือหมายเลขฟิลด์และ C ตำแหน่งอักขระในฟิลด์ ทั้งสองเป็นจุดเริ่มต้น 1 หากไม่มีทั้ง -t หรือ -b จะมีผลอักขระในฟิลด์จะถูกนับจากจุดเริ่มต้นของช่องว่างก่อนหน้านี้ OPTS เป็นตัวเลือกการสั่งซื้อแบบตัวอักษรเดียวอย่างน้อยหนึ่งตัวซึ่งจะแทนที่ตัวเลือกการสั่งซื้อทั่วโลกสำหรับคีย์นั้น หากไม่มีการระบุคีย์ให้ใช้ทั้งบรรทัดเป็นคีย์
ด้วย --key = 1.3,1.3 คุณบอกว่ามีเพียงหนึ่งฟิลด์ (ทั้งบรรทัด) และคุณกำลังเปรียบเทียบตำแหน่งอักขระตัวที่สามของฟิลด์นี้
sort -u -k3 < myFile
โปรดทราบว่าคุณสามารถเขียนนี้เป็น