使用 -t\t 加入是一个错误吗?

使用 -t\t 加入是一个错误吗?

我的命令有问题join。 “默认连接字段是第一个,由空格分隔”(引用自join --help)。但是,我的制表符分隔文件中有一个包含句子的字段。因此,我想使用-t\t(我也尝试过-t "\t"在Cygwin下报告错误,但在CentOS下报告错误)来连接这两个文件。出乎意料的是,该命令连续两行输出了这些字段。我已经用dos2unix和处理了这两个文件sort

输出示例如下。第 1 行和第 3 行来自 file1,第 2 行和第 4 行来自 file2。第一行和第二行应出现在同一行。但是,如果-t\t使用 ,它们会出现在连续的两行中(如下所示);如果不是-t,则它们出现在同一行。

LM00089 0.6281  0       Q27888  L-lactate dehydrogenase
LM00089 gi|2497622|sp|Q27888|LDH_CAEEL  0.6281  0.422
LM00136 0.3219  0.376741        O62619  Pyruvate kinase
LM00136 gi|27923979|sp|O62619|KPYK_DROME        0.3219  0.111

我想知道这是一个错误还是我犯了一些错误。

答案1

-t \t作为分隔符传递t:不带引号的反斜杠始终按字面意思获取下一个字符(除非下一个字符是换行符)。-t "\t"传递\t作为分隔符,join当您传递多个字符时,不同版本的行为可能会有所不同。

要从 bash 传递选项卡,请使用-t $'\t'.该$'…'语法模仿 C 和许多其他语言的特征,其中\后跟字母表示控制字符,并且\可以后跟八进制数字。

另一种方法是在脚本中放置一个文本制表符(在单引号或双引号之间)。这不太可读。

如果您需要所有 POSIX shell 的可移植性,例如dash,请使用

tab=$(printf '\t')
join -t "$tab" …

或直接join -t "$(printf '\t')" ….

相关内容