GNU/Linux >> Linux の 問題 >  >> Linux

2つのファイルを区切り文字のトリプルパイプ記号「|||」で1行ずつマージしますか?

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

サブシェルがスポーンされるのを防ぐため。


Linux
  1. screenieを使用したコマンドラインでのマルチタスク

  2. 2つのファイルを2つの列に印刷しますか?

  3. Wcで各行の文字を数えますか?

  1. シェル内の複数のファイルにパイプしますか?

  2. AWK を使用して 2 つのファイルをマージする方法は?

  3. 2 つのファイルを 1 行ずつ一貫してマージする方法

  1. コマンドラインでsortを使用してソートする

  2. sedを使用してコマンドラインでテキストを操作する

  3. diff を使用して 2 つのファイルを手動でマージする