วิธีใช้ awk จัดเรียงตามคอลัมน์ 3


92

ฉันมีไฟล์ (user.csv) แบบนี้

ip,hostname,user,group,encryption,aduser,adattr

ต้องการพิมพ์เรียงคอลัมน์ทั้งหมดตามผู้ใช้

ฉันลองawk -F ":" '{print|"$3 sort -n"}' user.csvแล้วมันไม่ได้ผล


12
sort -t, -k3 file
Kevin

คำตอบ:


181

แค่sort.

sort -t, -nk3 user.csv

ที่ไหน

  • -t,- กำหนดตัวคั่นของคุณเป็น,.

  • -n- ช่วยให้คุณจัดเรียงตัวเลข เพิ่มตั้งแต่คุณเพิ่มในความพยายามของคุณ หากช่องผู้ใช้ของคุณเป็นเพียงข้อความคุณก็ไม่จำเป็นต้องใช้

  • -k3- กำหนดฟิลด์ (คีย์) ผู้ใช้คือฟิลด์ที่สาม


2
ฉันจะใช้การจัดเรียง 2 คอลัมน์ได้อย่างไร ตัวอย่างเช่นฉันต้องการจัดเรียงตามคอลัมน์ 6 ก่อนและจัดเรียงตามคอลัมน์ 3 วินาที
user2452340

1
สิ่งนี้จะใช้ไม่ได้หากมีสตริงที่มีเครื่องหมายอัญประกาศที่มีเครื่องหมายจุลภาคใน CSV (เว้นแต่คอลัมน์ที่คุณต้องการจัดเรียงจะอยู่ก่อนหน้าคอลัมน์ที่มีเครื่องหมายจุลภาค) คุณอาจต้องทำรหัสผ่านก่อนด้วย awk (โดยใช้ FPAT = "[^,] * | \" [^ \ "] * \" "และ OFS =" | "หรือตัวคั่นอื่น ๆ ที่คุณสามารถใช้กับการจัดเรียงได้)
davemyron

1
@ user2452340 คุณสามารถทำได้: sort -t, -nk3 filename.csv | sort -t, -nk6- ก่อนอื่นจะเรียงตามคอลัมน์ 3 จากนั้นจะจัดเรียงตามคอลัมน์ 6 เพื่อให้คอลัมน์ 6 เรียงลำดับอย่างถูกต้องตลอดทางและสำหรับแถวใด ๆ ที่คอลัมน์ 6 เหมือนกันแถวนั้นจะเรียงตามคอลัมน์ 3 .
Matthew

3
@ แมทธิวsort -t ',' -k3,3n -k6,6nจะดีขึ้น -k3จะใช้คอลัมน์ 3 และส่วนที่เหลือของบรรทัด
Kusalananda

1
ฉันแค่ต้องการ -t เพื่อแบ่งไฟล์ 2 คอลัมน์ของฉันหารด้วยจุลภาคขอบคุณ jaypal
Ricardo Rivera Nieves

22
  1. ใช้ awk เพื่อใส่ ID ผู้ใช้ไว้ด้านหน้า
  2. จัดเรียง
  3. ใช้ sed เพื่อลบ ID ผู้ใช้ที่ซ้ำกันโดยสมมติว่า ID ผู้ใช้ไม่มีช่องว่างใด ๆ

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    

สิ่งนี้มีประโยชน์มากโดยเฉพาะอย่างยิ่งหากคุณต้องการแยกวิเคราะห์หรือรวมคอลัมน์เพื่อเพิ่มฟิลด์การจัดเรียงจากนั้นคงไว้เฉพาะบรรทัดเดิม ฉันใช้ awk / แยกเพื่อแยกวิเคราะห์ / รวมช่องวันที่และเวลาสำหรับการเรียงลำดับจากนั้นจึงนำออก
skytaker

1
sortรู้วิธีการจัดเรียงตามคอลัมน์ใดคอลัมน์หนึ่งแล้ว แต่เทคนิคนี้เรียกว่าการแปลง Schwartzianมีประโยชน์เมื่อฟิลด์ที่คุณต้องการจัดเรียงไม่ใช่คอลัมน์ที่กำหนดไว้อย่างดี
tripleee

11

คุณสามารถเลือกตัวคั่นได้ในกรณีนี้ฉันเลือกเครื่องหมายจุดคู่และพิมพ์คอลัมน์หมายเลขหนึ่งโดยเรียงตามลำดับตัวอักษร:

awk -F\: '{print $1|"sort -u"}' /etc/passwd

9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

และสำหรับลำดับย้อนกลับ

awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 



0

ในการแยกบรรทัดแรก (ส่วนหัว) ออกจากการเรียงลำดับฉันแยกมันออกเป็นสองบัฟเฟอร์

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.