Sort
為文本文件選擇排序鍵時遇到問題
假設我有一個這樣的文本文件:
e8:b4:c8:b2:d8:b9 "Biswas Gautam" 2016 me Mob ec:8e:b5:f8:a2:12 "Dipin Gyawali" 2015 me Lan f0:27:65:70:91:62 "Karan Rai" 2016 cs Mob f0:de:f1:33:33:32 "Dipendra L. Karki" 2015 me Lan
我想按第三列(年)和第 4 列排序,像我這樣的批次(機械工程)和 cs(電腦科學)和第三列
但是第二列名稱正在產生問題;有時他們有一個中間名,這與我最初的解決方案相衝突。所以我認為雙引號可以解決問題。但我不知道如何忽略雙引號內的空格。
sort -k 4 -k 5 -k 2 -kfilename
我寫了 4 因為會有三個空格,一個由於列,一個由於全名(名稱
$$ space $$姓) 有沒有辦法對這些事情進行排序?
$ sed -E 's/ {3,}/@/g' file | sort -t @ -k3,3 -k5,5 | sed 's/@/ /g' ec:8e:b5:f8:a2:12 "Dipin Gyawali" 2015 me Lan f0:de:f1:33:33:32 "Dipendra Karki" 2015 me Lan e8:b4:c8:b2:d8:b9 "Biswas Gautam" 2016 me Mob f0:27:65:70:91:62 "Karan Rai" 2016 cs Mob
這將用字元替換任何三個或更多空格的執行
@
(數據中不存在的任何字元都可以使用)。然後,
sort
被指示將其輸入解釋為@
- 分隔的欄位,並在第 3 個欄位(年份)和第 5 個欄位(設備)上排序。最後用四個空格sed
替換@
已排序數據中的每個(您可以選擇在此處插入文字製表符,或者\t
使用 GNUsed
)。更漂亮:
$ sed -E 's/ {3,}/@/g' file | sort -t @ -k3,3 -k5,5 | column -s @ -t ec:8e:b5:f8:a2:12 "Dipin Gyawali" 2015 me Lan f0:de:f1:33:33:32 "Dipendra Karki" 2015 me Lan e8:b4:c8:b2:d8:b9 "Biswas Gautam" 2016 me Mob f0:27:65:70:91:62 "Karan Rai" 2016 cs Mob
以下用於
awk
將每列格式化為左對齊的 20 個字元寬的字元串:$ sed -E 's/ {3,}/@/g' file | sort -t @ -k3,3 -k5,5 | awk -F@ '{ for (i=1;i<=NF;++i) printf("%-20s",$i); print "" }' ec:8e:b5:f8:a2:12 "Dipin Gyawali" 2015 me Lan f0:de:f1:33:33:32 "Dipendra Karki" 2015 me Lan e8:b4:c8:b2:d8:b9 "Biswas a Gautam" 2016 me Mob f0:27:65:70:91:62 "Karan Rai" 2016 cs Mob
或者,您可以單獨格式化它們:
$ sed -E 's/ {3,}/@/g' file | sort -t @ -k3,3 -k5,5 | awk -F@ '{ printf("%s %-30s %-30s %-30s %s\n", $1,$2,$3,$4,$5) }' ec:8e:b5:f8:a2:12 "Dipin Gyawali" 2015 me Lan f0:de:f1:33:33:32 "Dipendra Karki" 2015 me Lan e8:b4:c8:b2:d8:b9 "Biswas a Gautam" 2016 me Mob f0:27:65:70:91:62 "Karan Rai" 2016 cs Mob