【问题标题】:sort multiple tabs but ignoring spaces对多个选项卡进行排序但忽略空格
【发布时间】:2011-09-30 07:09:35
【问题描述】:

我有一个这样的数据文件(\t 代表制表符):

short line\t    \t    \t    \t    \t    3
very long line with lots of text\t\t    2

如何使用 sort 按第二列对其进行排序?换句话说,我想将分隔符设置为多个制表符,而不是空格。

【问题讨论】:

    标签: bash unix sorting command-line command-line-interface


    【解决方案1】:

    看来sort的字段分隔符必须是单个字符,所以这个命令:

    sort -t $'\t' -k2 file
    

    不会将多个选项卡作为单个分隔符处理:它将对两行的空第二个字段进行排序。

    此命令将成功找到第二个字段,但它修改了文本:

    tr -s '\t' < file | sort -t $'\t' -k2
    

    请注意,tr 将 2 个字符的字符串 "\t" 解释为制表符,而 sed -t 不会。只是如何实现不同命令的一个弱点。

    【讨论】:

    • 这对我有用。然后我使用类似这样的东西将输出重新格式化为对齐的列: awk 'BEGIN{ FS="\t"};{ for(i=1;i
    【解决方案2】:

    使用 -t 参数将字段分隔符设置为其他内容。但是传递制表符可能会很棘手,因此解决方案可能如下所示:

    sort -t "$(echo -e '\t')" -k 2 file.txt

    【讨论】:

    • 如果 echo 包含在 $(...) 中以生成选项卡,我可以看到这将起作用。不过,我认为 CTRL-V 选项卡解决方案更容易。
    • 是的,最初我使用了 Stackoverflow 没有显示的单引号字符。现在我把它改成了另一种 $(..) 符号。
    • Ctrl+V 解决方案假定您使用的是专门配置的终端(将这种组合解释为插入制表符而不是按键)。如果您复制/粘贴它(例如,在将制表符转换为空格然后再返回的终端中),该解决方案也可能会导致麻烦。如果您尝试在脚本文件中使用它并使用奇怪的编辑器,也会出现问题。
    【解决方案3】:
    sort -k2 -t'        ' test.txt
    

    为我开箱即用。在' ' 中输入TAB as C-vTab in bash

    【讨论】:

    • 虽然这适用于我的 linux 机器,但它不适用于我的 cygwin 机器。 :(
    • 这很有趣。我在... cygwin 上测试了它
    猜你喜欢
    • 2022-06-11
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2023-02-18
    相关资源
    最近更新 更多