-t\t を使って参加するのは間違いですか?

-t\t を使って参加するのは間違いですか?

私のコマンドに問題がありますjoin。 「デフォルトの結合フィールドは最初にスペースで区切られます」(で引用join --help)。ただし、タブ区切りファイルには文を含むフィールドがあります。したがって、次のようにこれら2つのファイルをリンクしたいと思います-t\t(Cygwinではエラーを報告しようとしましたが、-t "\t"CentOSでは試していません)。予期せず、コマンドはこれらのフィールドを2つの連続したラインに出力します。dos2unixとの両方のファイルを処理しましたsort

サンプル出力は次のとおりです。 1行と3行はfile1からインポートされ、2行と4行はfile2からインポートされます。 1行目と2行目は同じ行に表示する必要があります。ただし-t\t、使用する場合は2つの連続した行に表示されます(下記参照)。それ以外の場合は、-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"渡されると、複数の文字を渡すときにさまざまなバージョンが異なる動作をする可能性があります。\tjoin

Bashからタブを渡すには、を使用します-t $'\t'。この$'…'構文は、Cや他の多くの言語の機能を模倣しています。ここで、\制御文字が続く文字は制御文字を表し、その後\に8進数が続くことがあります。

別の方法は、スクリプトにテキストタブ文字(一重引用符または二重引用符の間)を置くことです。これは読みにくいです。

たとえば、すべてのPOSIXシェルの移植性が必要な場合は、次のようにdashします。

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

または直接join -t "$(printf '\t')" …

関連情報