はじめに

こんにちは!今回はpasteコマンドについて解説します。

pasteは複数のファイルの行を横方向に結合するコマンドです。cutコマンドの逆バージョンって感じですね。縦に並んだ複数のリストを横に並べたい時に超便利です!

テキスト処理でめっちゃ活躍するコマンドなので、これを機にマスターしちゃいましょう!

pasteコマンドとは

pasteは、複数のファイルの対応する行を指定された区切り文字で結合して出力する外部コマンドです。

例えば、ファイルAに名前のリストが縦に並んでいて、ファイルBに年齢のリストが縦に並んでいる場合、pasteを使えば両方を横に並べて「名前\t年齢」という形式に変換できます。

基本構文

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

複数のファイルを指定して、対応する行を結合します。

主なオプション

オプション 説明
-d 区切り文字を指定(デフォルトはタブ)
-s 各ファイルの行を1行に結合
-z 出力をNUL文字で区切る(GNU拡張)

使用例

例1: 2つのファイルを横に結合

テストファイルを作成します。

1
2
3
echo -e "Alice\nBob\nCharlie" > names.txt
echo -e "25\n30\n28" > ages.txt
paste names.txt ages.txt

実行結果:

1
2
3
Alice 25
Bob 30
Charlie 28

2つのファイルの行を横に結合します。デフォルトではタブで区切られます。

例2: 区切り文字を指定

1
paste -d ',' names.txt ages.txt

実行結果:

1
2
3
Alice,25
Bob,30
Charlie,28

-dオプションでコンマを区切り文字に指定します。

例3: 複数の区切り文字を指定

1
2
3
4
echo -e "A\nB\nC" > col1.txt
echo -e "1\n2\n3" > col2.txt
echo -e "X\nY\nZ" > col3.txt
paste -d ':' col1.txt col2.txt col3.txt

実行結果:

1
2
3
A:1:X
B:2:Y
C:3:Z

複数のファイルを結合する時、指定した区切り文字で結合されます。

例4: 各ファイルの行を1行に結合

1
paste -s names.txt

実行結果:

1
Alice Bob Charlie

-sオプションで1つのファイルの行を1行に結合します。

例5: 複数ファイルをそれぞれ1行に

1
paste -s names.txt ages.txt

実行結果:

1
2
Alice Bob Charlie
25 30 28

複数ファイルを指定すると、ファイルごとに行を結合します。

例6: 標準入力を使用

1
echo -e "Name\nCity" | paste - names.txt

実行結果:

1
2
Name Alice
City Bob

ハイフン-で標準入力を表します。

例7: 空行を含むファイルの結合

1
2
3
echo -e "A\n\nC" > file1.txt
echo -e "1\n2\n3" > file2.txt
paste file1.txt file2.txt

実行結果:

1
2
3
4
A 1

 2
C 3

空行もそのまま結合されます。

例8: 複数の区切り文字を順番に使用

1
paste -d ':|' names.txt ages.txt

実行結果:

1
2
3
Alice|25
Bob|26
Charlie|27

-dに複数の文字を指定すると、順番に使用されます。

例9: リストをCSV形式に変換

1
2
3
echo -e "Japan\nUSA\nFrance" > countries.txt
echo -e "Tokyo\nWashington\nParis" > cities.txt
paste -d ',' countries.txt cities.txt

実行結果:

1
2
3
Japan,Tokyo
USA,Washington
France,Paris

複数のテキストリストをCSV形式に変換できます。

例10: 複数ファイルを行番号付きで結合

1
paste -d ' ' <(nl names.txt | awk '{print $2}') ages.txt

実行結果:

1
2
3
Alice 25
Bob 30
Charlie 28

プロセス置換を使った高度な例です。

Tips・注意点

cut コマンドとセット

pastecutの逆操作です。cutで列を抽出した後、複数のファイルをpasteで結合するパターンがよく使われます。

1
2
3
4
5
6
# cutでファイルから特定列を抽出
cut -f1 data.csv > col1.txt
cut -f2 data.csv > col2.txt

# pasteで2つのファイルを結合
paste col1.txt col2.txt

行数が異なる場合

ファイルの行数が異なる場合、短いファイルの方に合わせて結合されます。

1
2
3
# file1は3行、file2は5行の場合
paste file1.txt file2.txt
# 結果は3行になる

タブとスペースの違い

デフォルトはタブで区切られます。スペースが必要な場合は明示的に指定しましょう。

1
2
3
4
5
# デフォルト(タブ)
paste file1.txt file2.txt

# スペースで区切る
paste -d ' ' file1.txt file2.txt

実践的な使い方

CSVファイルのカラム入れ替え

1
2
3
4
5
# 元データ: col1,col2,col3
cut -d',' -f1 data.csv > col1.txt
cut -d',' -f3 data.csv > col3.txt
cut -d',' -f2 data.csv > col2.txt
paste -d',' col3.txt col2.txt col1.txt

複数のカラムの順序を入れ替えたい時に便利です。

ログファイルのマージ

1
2
# サーバーAとサーバーBのログをマージ
paste -d ' | ' server_a.log server_b.log > merged.log

複数のログファイルを横に並べて比較する時に使えます。

データフォーマットの変換

1
2
# 複数の値をCSVに統合
paste -d',' <(cat first_names.txt) <(cat last_names.txt)

複数の単一列ファイルを複数列のCSVに変換できます。

まとめ

pasteコマンドのポイント:

  • 複数ファイルの行を横に結合する基本コマンド
  • -dオプション: 区切り文字を指定(タブがデフォルト)
  • -sオプション: ファイルの行を1行に結合
  • ハイフン-で標準入力を表現
  • cutコマンドと組み合わせてデータ処理が強力
  • よく使う組み合わせ: paste -d ',' file1 file2paste -s file

縦のデータを横に並べたい時はpasteを使いましょう!