pasteコマンド(複数のファイルを行単位で連結する)
- 〈このページの構成〉
形式
paste[-s][-d リスト][パス名 ...]
機能
複数のファイルを行単位に連結して標準出力に出力します。ファイル内のすべての行を1行に結合してから複数のファイルを連結することもできます。
引数
- -s
-
ファイル内のすべての行を区切り文字によって結合して1つの行にします。
-sオプションを指定しない場合は,各ファイルの同じ行番号の行を区切り文字で結合します。
- -d リスト
-
結合する行と行の間に挿入する区切り文字をリストに指定します。-dオプションを指定しない場合,タブ文字が指定されたものとします。
スペースまたはタブを指定する場合は,"(ダブルクォーテーション)で囲んでください。
区切り文字には次の特殊文字も指定できます。
使用できる特殊文字
意味
備考
\n
改行文字
Windowsの場合,[CR]+[LF]が改行文字となります。
UNIXの場合,[LF]が改行文字となります。
\t
タブ文字
−
\\
1つのバックスラッシュ文字
−
\0
空文字列
長さ0の文字列("")です。結合する行と行の間に区切り文字を挿入しません。
特殊文字を指定する場合,pasteコマンドを実行するシェルによってはエスケープ文字として扱われるため,特殊文字をクォーテーション("または')で囲む必要があります。特殊文字以外の文字の直前に「\」を指定した場合,「\」は無視され,「\」の直後の文字が区切り文字として使用されます。また,「\」だけを指定した場合はエラーで終了します。
区切り文字は複数指定できます。区切り文字を複数指定した場合の動作を次に示します。
-
行を結合するたびに区切り文字を取り出して,行と行の間に挿入します。区切り文字は先頭の区切り文字から順に取り出されます。
-
-sオプションが指定されていない場合,結合した行を出力したときは,再び先頭の区切り文字から順に取り出されます。
-
-sオプションが指定されている場合,ファイル内のすべての行を結合して出力したときは,再び先頭の区切り文字から順に取り出されます。
-
区切り文字を取り出すときに,-dオプションに指定した区切り文字を使い切っていた場合は再び先頭の区切り文字から順に取り出されます。
-
- パス名
-
連結して出力するファイルのパス名を指定します。パス名を指定しない,またはパス名に「-」を指定した場合は,標準入力から入力します。
パス名,および「-」は複数指定できます。パス名と「-」を混在して指定することもできます。
複数のファイルを指定した場合,オープンに失敗したファイルがあると次のように動作します。
-
-sオプションが指定されていないときはエラーメッセージを出力し,終了コード1でエラー終了します。標準出力には何も出力されません。
-
-sオプションが指定されているときはオープンに失敗したファイル対してエラーメッセージを出力し,処理を続行します。すべてのファイルに対して処理をしたあと終了コード1で終了します。
パス名を1つだけ指定した場合は次のように動作します。
-
-sオプションが指定されていないときは行の出力だけが行われます。
-
-sオプションが指定されているときはファイル内のすべての行を結合して出力します。
-
行の入力と出力
入力ファイル内の行は,改行文字で区切られたレコードが1つの行と見なされます。
-
Windowsの場合,[CR]+[LF]または[LF]が改行文字と見なされます。
-
UNIXの場合,[LF]が改行文字と見なされます。
なお,入力ファイルの各レコードが[CR]+[LF]で区切られている場合は,連結後の行には[CR]が含まれます。
連結後に出力される行の終わりには改行文字が出力されます。出力される改行文字は次のとおりです。
-
Windowsの場合,[CR]+[LF]で出力されます。
-
UNIXの場合,[LF]で出力されます。
行単位の連結(-sオプションが指定されていない場合)
各ファイルの同じ行番号の行を区切り文字によって結合し,結合した結果を1つの行として出力します。なお,同じ行番号の行が空行の場合,行の内容は空文字列としてほかのファイルの行と結合されます。
各ファイルから同じ行番号の行を入力するときに,一部のファイルの入力でファイルの終端に達した場合,そのファイルの行の内容は空文字列としてほかのファイルの行と結合されます。
file1,file2,file3,file4を行単位に連結する例を次に示します。
- file1の内容
a001 a002
- file2の内容
b001 (空行) b003
- file3の内容
c001 c002 c003 c004
- file4の内容
d001
- file1,file2,file3,file4を行単位に連結するコマンド
$ paste file1 file2 file3 file4
このとき,次のように連結します。「→」は区切り文字のタブ文字を表します。
a001→b001→c001→d001 1. a002→→ c002→ 2. → b003→c003→ 3. → → c004→ 4.
-
file1,file2,file3,file4の1行目の内容を結合して出力します。行と行の間にはタブ文字を挿入します。
-
次の値をタブ文字によって結合し出力します。
-
file1の2行目の内容
-
file2の2行目は空行のため空文字列
-
file3の2行目の内容
-
file4はファイル終端のため空文字列
空文字列は長さ0の文字列であるため,実際には「file1の2行目の内容+タブ文字+タブ文字+file3の2行目の内容+タブ文字」が出力されます。
-
-
次の値をタブ文字によって結合し出力します。
-
file1はファイル終端のため空文字列
-
file2の3行目の内容
-
file3の3行目の内容
-
file4はファイル終端のため空文字列
実際には「タブ文字+file2の3行目+タブ文字+file3の3行目+タブ文字」が出力されます。
-
-
次の値をタブ文字によって結合し出力します。
-
file1はファイル終端のため空文字列
-
file2はファイル終端のため空文字列
-
file3の4行目の内容
-
file4はファイル終端のため空文字列
実際には「タブ文字+タブ文字+file3の4行目+タブ文字」が出力されます。
-
なお,一部のファイルが空のファイルの場合もそのファイルの行の内容は空文字列としてほかのファイルの行と結合されます。ただし,引数に指定したファイルすべてが空のファイルの場合は行は出力されません。
ファイル内の行の結合(-sオプションが指定されている場合)
1つのファイル内のすべての行を区切り文字によって結合し,1つの行にしてからほかのファイルと連結します。なお,ファイルが空の場合は改行文字だけを出力します。引数に指定したファイルすべてが空のファイルの場合もファイルごとに改行文字が出力されます。
file1,file2,file3,file4を連結する例を次に示します。
- file1の内容
a001 a002
- file2の内容
空のファイル
- file3の内容
c001 c002 c003 c004
- file4の内容
d001
- file1,file2,file3,file4を連結するコマンド
$ paste -s file1 file2 file3 file4
このとき,次のように連結します。「→」は区切り文字のタブ文字を表します。
a001→a002 1. 2. c001→c002→c003→c004 3. d001 4.
-
file1のすべての行を区切り文字で結合して出力します。
-
file2は空のファイルのため改行文字だけを出力します。
-
file3のすべての行を区切り文字で結合して出力します。
-
file4は1行だけのため,行の内容だけ出力します。
標準入力から入力した行の結合
標準入力から入力した行の結合について説明します。
- 行単位の結合(-sオプションが指定されていない場合)
-
標準入力から1行だけ入力し,ほかのファイルの行と結合します。「-」を複数指定した場合は「-」を指定した順に標準入力から1行ずつ入力し,それぞれ入力した行を結合します。
ファイルと標準入力の内容を連結する場合,標準入力からの入力は連結するファイルの終端に達するまで行われます。このため,標準入力から行を入力するときにEOFが入力されると,空文字列としてファイルの行と結合されます。
file1を標準入力から入力しfile2と行単位に連結する例を次に示します。
- file1の内容
a001 a002 a003 a004 a005
- file2の内容
b001 b002 b003 b004
- file1,file2を行単位に連結するコマンド
$ cat file1 | paste - file2 -
行は次の順に結合されます。
-
file1から入力した行(標準入力から入力)
-
file2から入力した行
-
file1から入力した行(標準入力から入力)
このとき,次のように連結します。「→」は区切り文字のタブ文字を表します。
a001→b001→a002 1. a003→b002→a004 2. a005→b003→ 3. → b004→ 4.
-
次の値をタブ文字によって結合し出力します。
・標準入力から入力した行の内容(file1の1行目の内容)
・file2の1行目の内容
・標準入力から入力した行の内容(file1の2行目の内容)
-
次の値をタブ文字によって結合し出力します。
・標準入力から入力した行の内容(file1の3行目の内容)
・file2の2行目の内容
・標準入力から入力した行の内容(file1の4行目の内容)
-
次の値をタブ文字によって結合し出力します。
・標準入力から入力した行の内容(file1の5行目の内容)
・file2の3行目の内容
・標準入力からはEOFを入力した(標準入力に出力するファイルが終端に到達している)ため空文字列
-
次の値をタブ文字によって結合し出力します。
・標準入力からはEOFを入力した(標準入力に出力するファイルが終端に到達している)ため空文字列
・file2の4行目の内容
・標準入力からはEOFを入力した(標準入力に出力するファイルが終端に到達している)ため空文字列
- ファイル内の行の結合(-sオプションが指定されている場合)
-
標準入力からEOFを入力するまで行の入力を繰り返し,標準入力から入力したすべての行を区切り文字で結合します。結合した行をほかのファイルと連結します。file1を標準入力から入力しfile2と連結する例を次に示します。
- file1の内容
a001 a002 a003
- file2の内容
b001 b002
- file1,file2を連結するコマンド(file1を標準入力から入力)
$ cat file1 | paste -s - file2
このとき,次のように連結します。「→」は区切り文字のタブ文字を表します。
a001→a002→a003 1. b001→b002 2.
-
標準入力から入力したすべての行(file1のすべての行)を区切り文字で結合して出力します。
-
file2から入力したすべての行を区切り文字で結合して出力します。
終了コード
終了コード |
意味 |
---|---|
0 |
正常終了 |
1 |
エラー終了
|
2 |
エラー終了
|
3 |
エラー終了
|
注意事項
-
pasteコマンドはテキストファイルを対象としています。バイナリファイルからの入力やバイナリデータの出力は,動作を保証しません。
-
-sオプションを指定しない場合,引数に指定した複数のファイルを同時にオープンします。UNIXの場合,OS全体で同時にオープンできるファイルの最大値,またはulimitでそのプロセスのファイルディスクリプタ数の最大値制限されているなどのOSの設定値によっては,ファイルをオープンするときにエラーが発生するおそれがあります。
使用例
-
複数のファイルを行単位に連結します。結合する行と行の間に挿入する区切り文字はタブ文字とします。出力結果の「→」はタブ文字を表します。
入力ファイル(file01)の内容
a001 a002 a003
入力ファイル(file02)の内容
b001 b002 b003
入力ファイル(file03)の内容
c001 c002 c003
このときのコマンド指定と実行結果を次に示します。
$ paste file01 file02 file03 a001→b001→c001 a002→b002→c002 a003→b003→c003
-
複数のファイルを行単位に連結します。結合する行と行の間には区切り文字「=」と「%」を順に挿入します。
入力ファイル(file01)の内容
a001 a002 a003
入力ファイル(file02)の内容
b001 b002 b003
入力ファイル(file03)の内容
c001 c002 c003
入力ファイル(file04)の内容
d001 d002 d003
このときのコマンド指定と実行結果を次に示します。
$ paste -d "=%" file01 file02 file03 file04 a001=b001%c001=d001 a002=b002%c002=d002 a003=b003%c003=d003
-
複数のファイルを行単位に連結します。結合する行と行の間には区切り文字「=」,「%」および「@」を順に挿入します。
入力ファイル(file01)の内容
a001 a002 a003
入力ファイル(file02)の内容
b001 b002 b003
入力ファイル(file03)の内容
c001 c002 c003
このときのコマンド指定と実行結果を次に示します。
$ paste -d "=%@" file01 file02 file03 a001=b001%c001 ※ a002=b002%c002 a003=b003%c003
- 注※
-
同じ行番号に対する行の連結回数は次のように2回です。
・file01の1行とfile02の1行を連結
・file01とfile02の行の連結結果に対してfile03の1行を連結
このため,-dオプションに指定した区切り文字「@」は使用されません。
-
lsコマンドで表示されるファイル名一覧を標準入力から入力し4列で出力します。ファイル名とファイル名の間には区切り文字「,」を挿入します。
$ ls a001 a002 a003 a004 b001 b002 b003 b004 c001 c002 $ ls | paste -d "," - - - - a001,a002,a003,a004 b001,b002,b003,b004 c001,c002,,
-
ファイル単位にファイル内の全行を結合して1行としたあと,各ファイルを連結します。結合する行と行の間には区切り文字「=」,「%」および「@」を順に挿入します。
入力ファイル(file01)の内容
a001 a002 a003
入力ファイル(file02)の内容
b001 b002 b003 b004
入力ファイル(file03)の内容
c001 c002 c003 c004 c005
入力ファイル(file04)の内容
d001 d002
このときのコマンド指定と実行結果を次に示します。
$ paste -s -d "=%@" file01 file02 file03 file04 a001=a002%a003 b001=b002%b003@b004 c001=c002%c003@c004=c005 d001=d002
-
複数のファイルを行単位に連結する場合に,存在しないファイルを指定したときのメッセージを次に示します。
$ paste file01 file02 file03 paste: file02: No such file or directory
-
ファイル内の全行を結合し,複数のファイルを連結します。入力ファイルとして存在しないファイルfile01とfile03が指定されています。
入力ファイル(file02)の内容
b001 b002 b003 b004
入力ファイル(file04)の内容
d001 d002
このときのコマンド指定と実行結果を次に示します。
$ paste -s -d "=%@" file01 file02 file03 file04 paste: file01: No such file or directory※ b001=b002%b003@b004 paste: file03: No such file or directory※ d001=d002
- 注※
-
標準エラー出力に出力される内容