ฉันมีไฟล์ (user.csv) แบบนี้
ip,hostname,user,group,encryption,aduser,adattr
ต้องการพิมพ์เรียงคอลัมน์ทั้งหมดตามผู้ใช้
ฉันลองawk -F ":" '{print|"$3 sort -n"}' user.csv
แล้วมันไม่ได้ผล
ฉันมีไฟล์ (user.csv) แบบนี้
ip,hostname,user,group,encryption,aduser,adattr
ต้องการพิมพ์เรียงคอลัมน์ทั้งหมดตามผู้ใช้
ฉันลองawk -F ":" '{print|"$3 sort -n"}' user.csv
แล้วมันไม่ได้ผล
คำตอบ:
แค่sort
.
sort -t, -nk3 user.csv
ที่ไหน
-t,
- กำหนดตัวคั่นของคุณเป็น,
.
-n
- ช่วยให้คุณจัดเรียงตัวเลข เพิ่มตั้งแต่คุณเพิ่มในความพยายามของคุณ หากช่องผู้ใช้ของคุณเป็นเพียงข้อความคุณก็ไม่จำเป็นต้องใช้
-k3
- กำหนดฟิลด์ (คีย์) ผู้ใช้คือฟิลด์ที่สาม
sort -t, -nk3 filename.csv | sort -t, -nk6
- ก่อนอื่นจะเรียงตามคอลัมน์ 3 จากนั้นจะจัดเรียงตามคอลัมน์ 6 เพื่อให้คอลัมน์ 6 เรียงลำดับอย่างถูกต้องตลอดทางและสำหรับแถวใด ๆ ที่คอลัมน์ 6 เหมือนกันแถวนั้นจะเรียงตามคอลัมน์ 3 .
sort -t ',' -k3,3n -k6,6n
จะดีขึ้น -k3
จะใช้คอลัมน์ 3 และส่วนที่เหลือของบรรทัด
ใช้ sed เพื่อลบ ID ผู้ใช้ที่ซ้ำกันโดยสมมติว่า ID ผู้ใช้ไม่มีช่องว่างใด ๆ
awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
sort
รู้วิธีการจัดเรียงตามคอลัมน์ใดคอลัมน์หนึ่งแล้ว แต่เทคนิคนี้เรียกว่าการแปลง Schwartzianมีประโยชน์เมื่อฟิลด์ที่คุณต้องการจัดเรียงไม่ใช่คอลัมน์ที่กำหนดไว้อย่างดี
คุณสามารถเลือกตัวคั่นได้ในกรณีนี้ฉันเลือกเครื่องหมายจุดคู่และพิมพ์คอลัมน์หมายเลขหนึ่งโดยเรียงตามลำดับตัวอักษร:
awk -F\: '{print $1|"sort -u"}' /etc/passwd
awk -F, '{ print $3, $0 }' user.csv | sort -nk2
และสำหรับลำดับย้อนกลับ
awk -F, '{ print $3, $0 }' user.csv | sort -nrk2
ลองสิ่งนี้ -
awk '{print $0|"sort -t',' -nk3 "}' user.csv
หรือ
sort -t',' -nk3 user.csv
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','
สิ่งนี้ควรใช้งานได้
ในการแยกบรรทัดแรก (ส่วนหัว) ออกจากการเรียงลำดับฉันแยกมันออกเป็นสองบัฟเฟอร์
df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
sort -t, -k3 file