【问题标题】:unix join separator charunix 连接分隔符
【发布时间】:2009-11-12 13:56:37
【问题描述】:

抱歉,这个问题可能是微不足道的。

我对 unix join 命令进行了一些尝试,尝试使用制表符而不是空格作为默认分隔符。 -t 是参数,但这些不起作用(ubuntu 9.10 64 bit 2.6.31-14,GNU coreutils version 7.4)

join file1 file2 -t"\t"
join file1 file2 -t="\t"
join file1 file2 -t="\\t"
join file1 file2 -t $"\t"

等等。当然,我总是可以使用一些不雅的解决方案,比如

join file1 file2 > output
sed "s/ /\t/g" output

但我想看起来很聪明 :-) 此外,如果有 -t 参数,它必须有效。

【问题讨论】:

  • 当使用 -t 时,如手册页所述,它表示“使用字符 CHAR 作为输入和输出字段分隔符。”当您的两个文件具有相同的终止符时,它就可以工作。

标签: csv unix join


【解决方案1】:

我认为它需要一个即时生成的变量

试试

join file1 file12 -t $'\t'

【讨论】:

  • 酷。我以前不知道$'...' 语法。
  • $'...' 语法是 ANSI-C Quoting
【解决方案2】:

你可以按CTRL+v Tab进入tab

join -t '<CTRL+v><Tab>' file1 file2

【讨论】:

    【解决方案3】:
    join -t "`echo '\t'`" file1 file2
    

    ps:在我的机器上,Red Hat Enterprise Linux Server release 5.1 (Tikanga),命令join -t $'\t' file1 file2返回“非法变量名”。

    【讨论】:

    • 感谢您添加特定于发行版的解决方案
    • 它在 Fedora 23 上不起作用,它什么都没有。
    【解决方案4】:

    另一个似乎可行的技巧是将 -t 选项用文字制表符括在引号中。这看起来像:

    join '-t    ' ...
    

    在 t 和右引号之间有一个可变空格(因为它是一个制表符)。

    键入,它是:

    join<Spc>'-t<Ctrl-v><Tab>' ...
    

    【讨论】:

      【解决方案5】:

      man join 说,选项必须放在文件名前面。你试过了吗

      join -t "\t" file1 file2
      

      ?

      编辑:反映托尼奥的答案,正确的行应该是

      join -t $'\t' file1 file2
      

      【讨论】:

      • 是的,不起作用。它给出了错误:join: multi-character tab `\\t'
      • 删除引号?至少错误消息在我的终端上消失了。
      • 我同意,错误消失了,但输出错误地为空,如下所示:-/
      【解决方案6】:

      其他方法是:

      join -t "`echo -e "\t"`" file1 file2`

      或以更 bash-fashion 的方式:

      join -t "$(echo -e "\t")" file1 文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        • 2010-10-09
        • 2016-06-04
        • 2015-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多