[英]How do I sort input with a variable number of fields by the second-to-last field?
编者注:问题的原始标题提到使用制表符作为字段分隔符。
在诸如
500 east 23rd avenue Toronto 2 890 400000 1
900 west yellovillage blvd Mississauga 3 800 600090 3
您如何以倒数第二列的升序排序?
编者注:OP随后提供了另一个示例输入行500 Jackson Blvd Toronto 3 700 40000 2
,其中仅包含8个以空格分隔的输入字段(与上面的9个相比),这表明需要处理可变字段中的多个字段。输入。
注意:有几个可能独立的问题:
更新 :问题C是相关的问题。
问题A: 仅由问题标题暗示:如何使用制表符( \\t
)作为字段分隔符?
问题B:在给定数目的字段的情况下,如何在不知道该字段的特定索引的情况下,按倒数第二个字段对输入进行排序?
问题C:在给定可变数量的字段的情况下,如何在倒数第二个字段中排序输入,而又不知道该字段的相应索引呢?
回答问题A:
sort
的-t
选项允许您指定字段分隔符。 默认情况下, sort
使用行内部的任何空白作为分隔符。
假设使用Bash,Ksh或Zsh,则可以使用ANSI C引用的字符串 ( $'...'
)将单个制表符指定为字段分隔符( $'\\t'
):
sort -t $'\t' -n -k8,8 file # -n sorts numerically; omit for lexical sorting
回答问题B:
注意:这假设所有输入行具有相同数量的字段,并且输入来自文件file
:
# Determine the index of the next-to-last column, based on the first
# line, using Awk:
nextToLastColNdx=$(head -n 1 file | awk -F '\t' '{ print NF - 1 }')
# Sort numerically by the next-to-last column (omit -n to sort lexically):
sort -t $'\t' -n -k$nextToLastColNdx,$nextToLastColNdx file
注意:要按单个字段排序,也必须始终将其也指定为结束字段(例如-k8,8
),因为如上所述,只有给定起始字段索引(例如-k8
)的sort
才从指定字段开始排序通过其余部分 。
回答问题C:
注意:这假设输入行可能具有可变数量的字段,并且在每一行上,应该将行的倒数第二个字段用作排序字段; 输入来自文件file
:
awk '{ printf "%s\t%s\n", $(NF-1), $0 }' file |
sort -n -k1,1 | # omit -n to perform lexical sorting
cut -f2-
awk
命令提取的每一行的第二到最后一个字段并且它预先考虑到在输出的输入线路,由制表符分隔。 cut
再次删除人为添加的排序字段。 我建议看“人排序”。
您将看到如何指定字段分隔符以及如何指定应该用作排序键的字段索引。
您可以使用sort -k 2
例如 :
echo -e '000 west \n500 east\n500 east\n900 west' | sort -k 2
结果是:
500 east
500 east
900 west
000 west
您可以在手册页中找到更多信息。 看一下手册页的结尾。 就在作者之前,您有一些有趣的信息:)
再见
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.