【问题标题】:Linux shell sort file according to the second column?Linux shell 根据第二列排序文件?
【发布时间】:2011-05-14 20:12:03
【问题描述】:

我有一个这样的文件:

FirstName, FamilyName, Address, PhoneNumber

如何按 FamilyName 对其进行排序?

【问题讨论】:

标签: linux shell


【解决方案1】:

如果这是 UNIX:

sort -k 2 file.txt

您可以使用多个-k 标志对多个列进行排序。例如,要按姓氏排序,然后按名字排序:

sort -k 2,2 -k 1,1 file.txt

“man sort”中的相关选项:

-k, --key=POS1[,POS2]

在 POS1 开始一个键,在 POS2(原点 1)结束它

POS 是 F[.C][OPTS],其中 F 是字段编号,C 是字段中的字符位置。 OPTS 是一个或多个单字母排序选项,它覆盖该键的全局排序选项。如果没有给出键,则使用整行作为键。

-t, --field-separator=SEP

使用 SEP 而不是非空白到空白的过渡

【讨论】:

  • 使用--field-separator=',' 时要小心一点,如果您可能有数据输入操作员输入“名字”的值,例如“比利鲍勃”或其他...空格很容易进入您的如果你不提防数据,但逗号相对不太可能。
  • 在这些字段中很可能出现逗号,例如“Smith, Jr.”。或“麦克道威尔,Sr。”或“约翰博士”或“纽约州纽约市”
  • 请注意,如果列在视觉上对齐,即每个字段之间的空格数不固定,则必须使用-b 选项。这是因为sort 实际上是在考虑要排序的字符串就在逗号之后开始,而不是从列的第一个字母开始。此外,您可能需要在命令前加上 LC_ALL=C,以避免由于语言环境而产生的任何副作用,即使在简单的 ASCII 文件上也可能发生这种情况。
  • @calandoa 感谢-b (--ignore-leading-blanks) 上的部分。澄清一点:echo -e 'aa<SPACE>a\na<SPACE><SPACE>b' | sort -k2 首先给出a<SPACE><SPACE>b(第二列在第一个non-blank to blank transition 之后开始,<SPACE><SPACE>b<SPACE>a 之前),但是-b 给出aa<SPACE>a 符合预期(@ 987654337@ 在b 之前)。
【解决方案2】:

仅按第二个字段排序(因此在第二个字段匹配的情况下,匹配的那些行将保持在原始顺序中的顺序,而不对其他字段进行排序):

sort -k 2,2 -s orig_file > sorted_file

【讨论】:

    【解决方案3】:
    sort -nk2 file.txt
    

    相应地你可以改变列号。

    【讨论】:

      【解决方案4】:

      FWIW,这是一种排序方法,用于显示哪些进程正在使用最多的 virt 内存。

      memstat | sort -k 1 -t':' -g -r | less
      

      排序选项设置为第一列,使用 : 作为列分隔符,数字排序和反向排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多