การเรียงลำดับข้อมูลตามคอลัมน์ที่สองของไฟล์


212

ฉันมีไฟล์สองคอลัมน์และ nจำนวนแถว

คอลัมน์ 1 มีnamesและ agecolumn2

ฉันต้องการเรียงลำดับเนื้อหาของไฟล์นี้ตามลำดับจากน้อยไปหามาก age (ในคอลัมน์ที่สอง)

ผลลัพธ์ควรแสดงถึงnameบุคคลที่อายุน้อยที่สุดพร้อมด้วยnameและจากนั้นเป็นบุคคลที่อายุน้อยที่สุดที่สองเป็นต้น ...

คำแนะนำสำหรับเปลือกซับหนึ่งหรือสคริปต์ทุบตี


1
Superset: ตัวคั่นแบบกำหนดเอง: stackoverflow.com/questions/1037365/…
Ciro Santilli 法轮功冠状病病六四事件法轮功

คำตอบ:


329

คุณสามารถใช้sortคำสั่ง :

sort -k2 -n yourfile

-n, --numeric-sortเปรียบเทียบตามสตริงตัวเลข Valu

ตัวอย่างเช่น:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54

1
นอกจากนี้โปรดทราบว่าการใช้-hแทนที่จะ-nเรียงลำดับค่าที่มนุษย์สามารถอ่านได้เช่น2Gหรือ3Kตัวเลขคั่นด้วยเครื่องหมายจุลภาคเช่น1,234.5
chillitom

ประสบปัญหากับการสั่งซื้อ "ผิด" ให้ความสนใจกับผู้ชาย "*** คำเตือน *** สถานที่ที่ระบุโดยสภาพแวดล้อมมีผลต่อการเรียงลำดับตั้งค่าLC_ALL=Cเพื่อรับลำดับการเรียงดั้งเดิมที่ใช้ค่าไบต์ดั้งเดิม" (สำหรับกรณีการจับคู่สตริงที่ไม่มี-n)
x'ES

สิ่งนี้ไม่ได้พิจารณาช่องว่างในคอลัมน์แรกไม่ทำงานหากมีคอลัมน์เพิ่มเติมหลังจากที่สองตั้งแต่ -k อ่านจนจบบรรทัด สมมติว่าเป็นไฟล์ TSV ทางออกที่ดีกว่าคือsort -t$'\t' -k2 -n FILE
tuxErrante

คุณอาจต้องระบุตัวคั่นโดยใช้ตัวเลือก -t
สเปกตรัม

85

สารละลาย:

sort -k 2 -n filename

เขียน verbosely เพิ่มเติมเป็น:

sort --key 2 --numeric-sort filename


ตัวอย่าง:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

คำอธิบาย:

  • -k # - อาร์กิวเมนต์นี้ระบุคอลัมน์แรกที่จะใช้ในการจัดเรียง (โปรดทราบว่าคอลัมน์ที่นี่ถูกกำหนดให้เป็นเขตข้อมูลที่คั่นด้วยช่องว่างอาร์กิวเมนต์-k5จะเรียงลำดับเริ่มต้นด้วยเขตข้อมูลที่ห้าในแต่ละบรรทัดไม่ใช่อักขระตัวที่ห้าในแต่ละบรรทัด)

  • -n - ตัวเลือกนี้ระบุ "การเรียงลำดับตัวเลข" หมายถึงคอลัมน์ที่ควรตีความว่าเป็นแถวของตัวเลขแทนที่จะเป็นข้อความ


มากกว่า:

ตัวเลือกทั่วไปอื่น ๆ ได้แก่ :

  • -r - ตัวเลือกนี้กลับคำสั่งการเรียงลำดับ นอกจากนี้ยังสามารถเขียนเป็น- ย้อนกลับ
  • -i - ตัวเลือกนี้จะละเว้นอักขระที่ไม่สามารถพิมพ์ได้ นอกจากนี้ยังสามารถเขียนเป็นละเลย-ไม่พิมพ์ออกมา
  • -b - ตัวเลือกนี้จะละเว้นช่องว่างนำหน้าซึ่งมีประโยชน์เนื่องจากมีการใช้ช่องว่างสีขาวเพื่อกำหนดจำนวนแถว นอกจากนี้ยังสามารถเขียนเป็นละเลยชั้นนำในช่องว่าง
  • -f - ตัวเลือกนี้จะไม่สนใจกรณีตัวอักษร "A" == "A" นอกจากนี้ยังสามารถเขียนเป็นละเลยกรณี
  • -t [ตัวคั่นใหม่] - ตัวเลือกนี้ทำให้การประมวลผลล่วงหน้าใช้ตัวดำเนินการอื่นที่ไม่ใช่ช่องว่าง นอกจากนี้ยังสามารถเขียนเป็น--field-คั่น

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


@Angelo คำตอบนี้น่าจะโพสต์เมื่อหลายปีที่ผ่านมาหลังจากที่คุณตอบคำถามนี้แล้ว แต่คุณคิดว่ามันเป็นคำตอบที่ยอมรับใหม่หรือไม่?
Jonathan Y.

ตัวเลือก-tเป็นเครื่องมือช่วยชีวิตจริง !! เมื่อคอลัมน์ของคุณมีช่องว่างและคอลัมน์ที่แตกต่างกันโดยตัวละครที่ได้รับเหมือน,หรือแท็บ
AKS

12

สำหรับค่าที่คั่นด้วยแท็บคุณสามารถใช้รหัสด้านล่างได้

sort -t$'\t' -k2 -n

-r สามารถใช้สำหรับรับข้อมูลตามลำดับจากมากไปน้อย
-n สำหรับการเรียงลำดับตัวเลข
-k, --key = POS1 [, POS2] โดยที่ k คือคอลัมน์ในไฟล์
สำหรับลำดับถัดลงมาด้านล่างคือรหัส

sort -t$'\t' -k2 -rn

4

sortใช้

sort ... -k 2,2 ...

8
คุณต้องใช้ -n เพื่อเรียงลำดับตามอายุ (การเรียงลำดับตัวเลข) มิฉะนั้น '11' จะมาก่อน '2'
Matt Ryall
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.