Sort

為文本文件選擇排序鍵時遇到問題

  • February 23, 2018

假設我有一個這樣的文本文件:

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使用 GNU sed)。

更漂亮:

$ 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

引用自:https://unix.stackexchange.com/questions/426133