按列排序未按预期工作

按列排序未按预期工作

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 ' '会将每个空格视为分隔符。使用sortwithout-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

显然,这假设数据的每一行始终包含四个空白分隔字段。

相关内容