あるファイルの文字列を別のファイルの文字列の下に置くことはできません。

あるファイルの文字列を別のファイルの文字列の下に置くことはできません。

コマンドを使用してファイルをリンクするのに奇妙な問題がありますcat。それぞれ文字列を含む2つのファイルがあります。

ファイル1:

ABC

ファイル2:

DEF

私がそうでなければcat file1 file2そうですcat file1 >> file2。出力は次のようになると予想されます。

ABC  
DEF

しかし、以下のような興味深い結果が出ました。

ABCDEF

ファイルを確認してみると、余分なスペースや文字がありません。ところで、文字列の後ろから手動で削除すると、1文字も表示されません。良い結果。私は私が見ることができないどんな種類の「隠された」文字やセリフもあると思いました。

接続しなければならないファイルが多すぎて面倒でした。手動で同じ操作を実行することはできません。

助けてくれてありがとう。

ベストアンサー1

pasteおそらく最も単純な(とても効率的なことは言うまでもありません)この問題を解決できることを意味します。

printf abc >file1
printf def >file2
paste -sd\\n file[12]

abc
def

paste順番に呼び出されると、名前付き-sの各入力ファイルを順番に読み取り、paste<tab>または指定された区切り文字列内の各ファイルの各行の出力を読み取ります-dpaste名前付き各 infile の出力は常に ewline で終わるのに対し、\nここの-d区切り文字も\newline で指定されるのでデフォルトではインポートしてcatエクスポートしますが、各ファイルは常に\newline で終わります。


Peterが以下に指摘したように、空のファイルによって追加の改行paste\n発生する可能性があります。これが問題であれば、実際にも同じsedアプローチを適用できます。いいえこの方法:

: > file0
sed '' file[012]

abc
def

しかし、今この方法を使うとsed(少なくともGNU)他の問題がある可能性があります。どんなsed願いでもいつも別の行をインポートする前にewlineを作成してください\n。しかし、非常にリンクされた入力ファイルの完全なシリーズの最後の行とそれに続くいくつかのseds(例:GNU)可能いいえ最後に改行文字を追加します。たとえば、私の入力ファイルの場合定義その後に改行文字はありません。

そして、それ質問ですね…

sed '' file[012] | paste -sd\\n

...上記のパイプラインはおそらくすべての基盤をカバーします。

おすすめ記事