我的命令有问题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')" …
.