按列排序未按預期工作
cat marks.txt
返回1) Amit Physics 80 2) Rahul Maths 90 3) Shyam Biology 87 4) Kedar English 85 5) Hari History 89
awk -F" " '{ print $4"\t" $0 }' marks.txt | sort | cut -f 2-
根據第四列成功對文本進行排序。上下文:https
://stackoverflow.com/questions/17048188/how-to-use-awk-sort-by-column-3 但要模擬投票最高的答案:sort -t" " -nk4 marks.txt
但只返回:1) Amit Physics 80 2) Rahul Maths 90 3) Shyam Biology 87 4) Kedar English 85 5) Hari History 89
為什麼排序子句不起作用?
-F
在中使用空格和在中awk
使用-t
空格的區別sort
如下:
awk -F ' '
和剛才一樣awk
。單個空格是FS
(內部欄位分隔符)的預設值,將導致awk
從數據中修剪側翼空格(製表符和/或空格),並將由連續空格分隔的子字元串視為欄位。sort -t ' '
會將每個空格視為分隔符。使用sort
without-t
將使實用程序以awk
與連續空白(製表符和/或空格)相同的方式將每一行劃分為欄位。你的第一個命令,
awk -F" " '{ print $4"\t" $0 }' marks.txt | sort -n | cut -f 2-
(施瓦茨變換)因此與
awk '{ print $4 "\t" $0 }' marks.txt | sort -n | cut -f 2-
或者,
OFS
用於將輸出欄位分隔符設置為選項卡,awk -v OFS='\t' '{ print $4, $0 }' marks.txt | sort -n | cut -f 2-
(還要注意上面的補充
-n
;sort
我們希望按數字排序。)顯式訪問每行的最後一個欄位允許其他欄位具有可變編號(例如,如果它們包含空格):
awk -v OFS='\t' '{ print $NF, $0 }' marks.txt | sort -n | cut -f 2-
您的
sort
命令可以重寫為按第 4 個空格分隔的列正確地按數字排序,如下所示:sort -k 4n marks.txt
這顯然假設每行數據將始終包含四個空格分隔的欄位。
using
sort -t' '
(space character as the field seperator here) 會將每個空格視為欄位分隔符,而不是將所有連續的空格視為單個分隔符,這就是為什麼它沒有給您預期的結果,這就是為什麼給出第一個 commmad 解決方案來分隔最後一個帶有專用製表符分隔符的欄位,然後根據該欄位進行排序,然後從輸出中刪除它。請注意,
-F" "
在 awk commnad 中使用 here 對命令輸出或處理沒有副作用,也可以將其刪除;另外知道在 awk 中, using-F" "
會將任何連續的空格視為單個分隔符,而在 sort 中-t" "
會將每個空格視為單獨的分隔符(awk 中的等價物是-F"[ ]"
,即將欄位分隔符定義為正則表達式)。最後,您最好執行以下操作:
awk '{ print $NF"\t"$0 }' marks.txt |sort |cut -f2-