2つの言語で同じ行数の2つの並列ファイルがあり、これら2つのファイルを区切り文字|||
を使用して1行ずつマージする予定です。 。たとえば、2つのファイルは次のとおりです。
ファイルA:
1Mo 1,1 I love you.
1Mo 1,2 I like you.
Hi 1,3 I am hungry.
Hi 1,4 I am foolish.
ファイルB:
1Mo 1,1 Ich liebe dich.
1Mo 1,2 Ich mag dich.
Hi 1,3 Ich habe Durst.
Hi 1,4 Ich bin neu.
期待される出力は次のようになります:
1Mo 1,1 I love you. ||| 1Mo 1,1 Ich liebe dich.
1Mo 1,2 I like you. ||| 1Mo 1,2 Ich mag dich.
Hi 1,3 I am hungry. ||| Hi 1,3 Ich habe Durst.
Hi 1,4 I am foolish. ||| Hi 1,4 Ich bin neu.
paste
を試しました 次のようなコマンド:
paste -d "|||" fileA fileB
ただし、返される出力には、次のようなパイプが1つだけ含まれています。
1Mo 1,1 I love you. |1Mo 1,1 Ich liebe dich.
1Mo 1,2 I like you. |1Mo 1,2 Ich mag dich.
トライプパイプでラインの各ペアを分離する方法はありますか|||
?
承認された回答:
POSIXペーストの場合:
:|paste -d ' ||| ' fileA - - - - fileB
paste
すべての入力ファイルの対応する行を連結します。ここに6つのファイルがあります。fileA
、-
の標準からの4つのダミーファイル 、およびfileB
。
区切り文字のリストには、スペース、3つのパイプが含まれ、スペースはこの順序でpast
によって使用されます。 循環的に。
6つのファイルの最初の行については、fileA
最初のダミーファイルと連結され(これは何もありません。no-op:演算子に感謝します)、line1-fileA
を生成します。 。
最初のダミーファイルはパイプによって2番目のダミーファイルと連結され、line1-fileA |
を生成します。 、次に2番目のダミーファイルと3番目のダミーファイルを生成し、line1-fileA ||
を生成します。 、4番目のダミーファイルを持つ3番目のダミーファイルは、line1-fileA |||
を生成します。 。
そして、fileB
を含む4番目のダミーファイル 、line1-fileA ||| line1-fileB
。
これらの手順はすべての行で繰り返され、期待どおりの結果が得られます。
:|
タイピングを減らすためのもので、主にインタラクティブシェルで使用されます。スクリプトでは、次を使用する必要があります:
</dev/null paste -d ' ||| ' fileA - - - - fileB
サブシェルがスポーンされるのを防ぐため。