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
为什么排序子句不起作用?
答案1
使用sort -t' '
(此处的空格字符作为字段分隔符)会将每个空格视为字段分隔符,而不是将所有连续的空格视为单个分隔符,这就是为什么它没有给您所期望的内容的原因,这就是为什么给出第一个逗号解决方案来分隔带有专用制表符分隔符的最后一个字段,然后根据该字段进行排序,然后从输出中删除它。
请注意,在 awk commnad 中使用-F" "
here 对命令输出或处理没有副作用,也可以将其删除;另外知道在 awk 中, using-F" "
会将任何连续空格视为单个分隔符,而在 sort 中-t" "
会将每个单个空格视为单独分隔符(awk 中的等效项是-F"[ ]"
,即将字段分隔符定义为正则表达式)。
最后,您最好按以下方式进行操作:
awk '{ print $NF"\t"$0 }' marks.txt |sort |cut -f2-
答案2
-F
使用带空格 inawk
和使用-t
带空格 in之间的区别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-
(A施瓦茨变换)因此与
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
命令可以重写为按第四个空白分隔列正确进行数字排序,如下所示:
sort -k 4n marks.txt
显然,这假设数据的每一行始终包含四个空白分隔字段。