ไฟล์เรียงลำดับเชลล์ของลินุกซ์ตามคอลัมน์ที่สอง?


89

ฉันมีไฟล์ลักษณะนี้:

FirstName, FamilyName, Address, PhoneNumber

ฉันจะจัดเรียงตาม FamilyName ได้อย่างไร


ระบบปฏิบัติการและหน่วยประมวลผลคำสั่งใด
เปรียญ

คำตอบ:


157

ถ้านี่คือ UNIX:

sort -k 2 file.txt

คุณสามารถใช้-kแฟล็กหลายรายการเพื่อจัดเรียงในคอลัมน์มากกว่าหนึ่งคอลัมน์ ตัวอย่างเช่นในการจัดเรียงตามชื่อสกุลจากนั้นให้ตั้งชื่อเป็นตัวตัดไท:

sort -k 2,2 -k 1,1 file.txt

ตัวเลือกที่เกี่ยวข้องจาก "man sort":

-k, --key = POS1 [, POS2]

เริ่มต้นคีย์ที่ POS1 สิ้นสุดที่ POS2 (ต้นทาง 1)

POS คือ F [.C] [OPTS] โดย F คือหมายเลขฟิลด์และ C ตำแหน่งอักขระในฟิลด์ OPTS คือตัวเลือกการสั่งซื้อด้วยตัวอักษรเดียวหรือมากกว่าซึ่งจะแทนที่ตัวเลือกการสั่งซื้อส่วนกลางสำหรับคีย์ หากไม่มีการกำหนดคีย์ให้ใช้ทั้งบรรทัดเป็นคีย์

-t, - ฟิลด์คั่น = SEP

ใช้ SEP แทนการเปลี่ยนแบบไม่เว้นว่างเป็นว่างเปล่า


2
โปรดใช้ความระมัดระวังเล็กน้อยใน--field-separator=','กรณีที่คุณอาจมีประเภทตัวดำเนินการป้อนข้อมูลในค่า "ชื่อ" เช่น "บิลลี่บ็อบ" หรืออะไรก็ตาม ... ช่องว่างสามารถเข้าถึงข้อมูลของคุณได้อย่างง่ายดายหากคุณไม่ป้องกัน แต่ เครื่องหมายจุลภาคค่อนข้างไม่น่าเป็นไปได้
Tony Delroy

1
มีกรณีที่มีเครื่องหมายจุลภาคในช่องเหล่านั้นเช่น "Smith, Jr. " หรือ "McDowell, Sr. " หรือ "
Dr.John

2
โปรดสังเกตว่าถ้าคอลัมน์อยู่ในแนวเดียวกันนั่นคือมีจำนวนช่องว่างที่ไม่คงที่ระหว่างแต่ละฟิลด์คุณต้องใช้-bตัวเลือก นี่เป็นเพราะsortจริงๆแล้วกำลังพิจารณาว่าสตริงที่จะจัดเรียงเริ่มต้นหลังเครื่องหมายจุลภาคไม่ใช่จากตัวอักษรตัวแรกของคอลัมน์ นอกจากนี้คุณอาจต้องนำหน้าคำสั่งด้วยLC_ALL=Cเพื่อหลีกเลี่ยงผลข้างเคียงใด ๆ เนื่องจากโลแคลซึ่งอาจเกิดขึ้นได้แม้กระทั่งในไฟล์ ASCII ธรรมดา
calandoa

@calandoa ขอบคุณสำหรับส่วนบน-b( --ignore-leading-blanks) เพื่อชี้แจงเล็กน้อย: echo -e 'aa<SPACE>a\na<SPACE><SPACE>b' | sort -k2ให้a<SPACE><SPACE>bก่อน (คอลัมน์ที่สองเริ่มต้นหลังจากคอลัมน์แรกnon-blank to blank transitionและ<SPACE><SPACE>bก่อนหน้า<SPACE>a) แต่-bให้aa<SPACE>aตามที่คาดไว้ ( aคือก่อนหน้าb)
Kirill Bulygin

7

หากต้องการจัดเรียงตามฟิลด์ที่สองเท่านั้น (ดังนั้นเมื่อฟิลด์ที่สองตรงกันบรรทัดที่ตรงกันจะยังคงอยู่ในลำดับที่อยู่ในฟิลด์เดิมโดยไม่ต้องเรียงลำดับในฟิลด์อื่น):

sort -k 2,2 -s orig_file > sorted_file

3

FWIW นี่คือวิธีการจัดเรียงเพื่อแสดงว่ากระบวนการใดใช้หน่วยความจำที่ดีที่สุด

memstat | sort -k 1 -t':' -g -r | less

ตัวเลือกการจัดเรียงถูกตั้งค่าเป็นคอลัมน์แรกโดยใช้: เป็นตัวแยกคอลัมน์การเรียงลำดับตัวเลขและการจัดเรียงแบบย้อนกลับ


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