จัดเรียงตามคอลัมน์ที่สาม


131

ฉันกำลังเจอไฟล์ 4 คอลัมน์ขนาดใหญ่ ฉันต้องการแสดงไฟล์เรียงลำดับใน stdout ตามคอลัมน์ที่ 3:

cat myFile | sort -u -k3

นั่นก็เพียงพอแล้วที่จะทำการหลอกลวง?


4
sort -u -k3 < myFileโปรดทราบว่าคุณสามารถเขียนนี้เป็น
gerrit

6
ในฐานะที่เป็นsort -u -k3 myFileแม้
เซบาสเตียนกราฟ

คำตอบ:


166
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เพราะช่องว่างที่ถูกละเลยในครั้งแรกผ่านในสถานที่ของฉันทุกประเภทก่อนcadcc

$ 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แยกที่อาจรวมถึงตัวละครอื่น ๆ นอกเหนือจากพื้นที่และแท็บขึ้นอยู่กับสถานที่
jfs

1
ดี +1 คุณช่วยอธิบายสิ่งที่3,3ทำ? ทำไมไม่เพียง3?
terdon

@terdon ดูคำอธิบายเพิ่มเติมพร้อมตัวอย่าง
Stéphane Chazelas

@JFSebastian คุณพูดถูกต้องตอบรับการอัปเดต
Stéphane Chazelas

อาเพื่อให้เรียงลำดับเฉพาะในวันที่ 3 ไม่ใช่สายที่เหลือขอบคุณ
terdon

4

หากคุณเข้าใจ "คอลัมน์" เช่นเดียวกับในไฟล์ข้อความ (อักขระที่ 4) ใช่แล้วโซลูชันของคุณควรใช้งานได้ (หรือแม้กระทั่งsort -u -k3 myFileอนุญาตให้sortใช้เวทมนต์หน่วยความจำที่มีการเข้าถึงแบบสุ่ม) หากคุณเข้าใจ "คอลัมน์" ในฐานข้อมูล - เอนทิตีทั้งหมดของข้อมูลตามด้วยตัวคั่นและความกว้างของคอลัมน์ตัวแปรคุณจะต้องมีสิ่งที่ชื่นชอบเช่นนี้ ls -l ตามขนาด

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(ซึ่งเทียบเท่ากับเรื่องเล็กน้อยls -lSแต่เป็นตัวอย่างที่ดี)


5
ไม่มีโดยเรียงลำดับเริ่มต้นคอลัมน์ว่างเปล่าแยกพวกเขาจะไม่คอลัมน์ตัวอักษรในการจัดเรียงในคอลัมน์ของตัวละครที่ 3 sort -k 1.3,1.3ไวยากรณ์จะเป็น: ls -l | sort -k5,5nเพื่อเรียงตามขนาด
Stéphane Chazelas

คำawkตอบคือสิ่งที่ฉันต้องการ
jchook

2
sort -g -k column_number 

เป็นคำสั่งด้านขวาเพื่อเรียงลำดับรายการใด ๆ ที่มีอักขระตัวเลขโดยใช้คอลัมน์เฉพาะ


1
การใช้ -k ได้รับการคุ้มครองค่อนข้างดีอยู่แล้วดังนั้นมันจะมีประโยชน์ถ้าคุณอธิบายว่าคำสั่งนี้แตกต่างหรือดีกว่าอย่างไร บางทีคุณอาจรวมหมายเลขคอลัมน์จริงเพื่อตอบคำถามจริงของ OP
Jeff Schaller

นี่ทำให้ฉันใช้ man pages: p "-g, --general-numeric-sort, เปรียบเทียบตามค่าตัวเลขทั่วไป" ซึ่งเป็นสิ่งที่ฉันต้องการในกรณีของฉัน
ร่วม


0
$ 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 คุณบอกว่ามีเพียงหนึ่งฟิลด์ (ทั้งบรรทัด) และคุณกำลังเปรียบเทียบตำแหน่งอักขระตัวที่สามของฟิลด์นี้

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