Awk

按列排序未按預期工作

  • January 10, 2022

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 ' '會將每個空格視為分隔符。使用sortwithout-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-

(還要注意上面的補充-nsort我們希望按數字排序。)

顯式訪問每行的最後一個欄位允許其他欄位具有可變編號(例如,如果它們包含空格):

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-

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