gpt4 book ai didi

linux - 如何按倒数第二个字段对具有可变数量字段的输入进行排序?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:07 25 4
gpt4 key购买 nike

编者注:问题的原始标题提到了制表符作为字段分隔符。

在诸如

的文本中
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-quoted string ($'...') 将单个制表符指定为字段分隔符 ($'\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),如上所述,因为 sort,仅给定一个 start 字段索引(例如,-k8),从指定字段排序到该行的其余部分


问题 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 再次删除人为前置的排序字段。

关于linux - 如何按倒数第二个字段对具有可变数量字段的输入进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34124204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com