Linux / コマンド / paste - ファイルの行を横に結合

pasteは、複数のファイルから同じ順序の行を取得し、1つの行に並べて貼り付けます。基本の区切り文字はタブで、縦に積まれた値を1行に変える際にも使用できます。

ファイルの内容を順に連結する cat と異なり、paste は1行目同士、2行目同士を対応させます。行数が違う場合は長い側の行数まで出力し、終わった側は空のフィールドとして扱います。名前と点数などを結合する場合は、同じ対象が同じ行番号に並んでいることが前提です。

基本的な文法

paste [オプション] [ファイル ...]

インストールされている実装とオプションは、配布版によって異なる場合があります。man pasteで現在のシステムの説明を確認してください。

使用例

2つのファイルを列として結合

1つ目のファイルの各行の横に2つ目のファイルの対応する行を貼り付けます。

paste names.txt scores.txt

区切り文字の指定

タブの代わりにコロンで2つのファイルの値を区切ります。

paste -d ':' names.txt scores.txt

1つのファイルを1行に変える

-s はファイル内の改行を区切り文字に置き換えて、1行にまとめます。複数ファイルを渡した場合は、すべてをまとめて1行ではなく、ファイルごとに別の1行になります。

paste -s -d ',' names.txt

二つの入力の同じ行を結合する

2つのファイルの1行目同士、2行目同士を横に並べます。以下はBashのプロセス置換 <(...) で、通常の入力データファイルを保存せず、各コマンドの出力を渡す例です。Bashで実行してください。

paste -d, <(printf 'Ana\nBob\n') <(printf '7\n12\n')

例の出力:

Ana,7
Bob,12

pasteは同じキーを検索するjoinとは異なり、行の位置だけを合わせます。一方の入力の行数が少ない場合、足りない部分は空の値で埋められます。POSIXシェルのようにプロセス置換をサポートしない環境では、二つの入力を一時ファイルとして準備してください。

主なオプションと形式

オプション・形式 説明
-d リスト 結合位置ごとに使う区切り文字のリストを指定し、末尾まで使うと先頭から繰り返します。リスト全体を毎回挿入する指定ではありません。\t はタブ、\0 は空の区切りで、NUL文字の出力ではありません。
-s ファイルごとの行を順番に1行に結合します。
- 標準入力をファイル引数の代わりに使用します。

使用する際の注意点

対応する行が同じ対象を指しているかを確認してください。順序が違っても、誤った組み合わせがエラーなく出力されます。共通キーで対応づけたい場合は、並べ替えの条件を確認してjoinによる共通フィールドの結合を使います。-d でカンマを指定しても、CSVの引用符やエスケープを自動で生成するわけではありません。

よくある質問

pasteとjoinの違いは何ですか?

pasteは行番号ごとに連結し、joinは共通フィールドの値が同じ行を結合します。

公式ドキュメント

オプションの正確な動作や実装ごとの差異は、pasteに関する公式ドキュメントで確認できます。