paste コマンドは行を列として結合します。標準では各入力ファイルから 1 行ずつ取り出し、タブでつないで、すべての入力が終わるまで繰り返します。
テキスト操作 · レッスン 7
paste
paste を使い、対応する行を結合したり、指定した区切り文字で行を直列化したりする方法を学びます。
ファイルを横に並べて結合する
$ printf 'alice\nbob\n' > names.txt
$ printf 'admin\nviewer\n' > roles.txt
$ paste names.txt roles.txt
alice admin
bob viewer
列間の空白はタブです。ファイル全体を順番に書く cat と異なり、paste は対応する入力行を結合します。
first.txt に A、B、second.txt に 1、2 が順に入っています。paste first.txt second.txt の標準出力はどれですか?
区切り文字を選ぶ
-d LIST で標準のタブを置き換えます。
$ paste -d ':' names.txt roles.txt
alice:admin
bob:viewer
シェルで意味を持つ区切り文字は引用します。paste は複数文字のリストを順に使えますが、2 列なら 1 文字が分かりやすいでしょう。
names.txt と roles.txt の対応する行をコロンで結ぶコマンドはどれですか?
1 ファイルの行を直列化する
-s は各入力ファイルを直列に処理し、その行を 1 つの出力行へ結合します。
$ printf 'The\nquick\nbrown\nfox\n' > words.txt
$ paste -s words.txt
The quick brown fox
$ paste -s -d ' ' words.txt
The quick brown fox
複数ファイルを -s へ渡すと、各ファイルがそれぞれ 1 出力行になります。
words.txt の全行を空白区切りの 1 行にするコマンドはどれですか?
長さの異なる入力を扱う
並列入力の行数が異なる場合、paste は最長のファイルが終わるまで続け、短いファイルの不足値を空フィールドにします。
$ printf 'A\nB\nC\n' > letters.txt
$ printf '1\n2\n' > numbers.txt
$ paste -d ':' letters.txt numbers.txt
A:1
B:2
C:
並列 paste に渡した 1 ファイルが他より先に終わるとどうなりますか?
stdin から 1 つの入力を読む
ファイルオペランドに - を使うと、その位置の入力を stdin から読みます。
$ printf 'admin\nviewer\n' | paste -d ':' names.txt -
alice:admin
bob:viewer
producer | paste names.txt - で - は何を意味しますか?
行指向データの結合を練習するには、次のラボを試してください。
- シンプルなテキスト処理 -
tr、col、join、pasteでテキストデータを操作、分析します。
レッスン完了
paste を完了しました
行指向の入力を一定した配置と区切りで結合できるようになりました。
複数ファイルの対応する行を結合する。
-dで標準のタブ区切りを置き換える。-sで 1 ファイルの行を直列化する。短い入力による空フィールドを解釈する。
stdin から入力する位置に
-を使う。