Diff of UNIX/コマンド/テキスト処理/paste


TITLE:paste - 行単位での結合
#navi(UNIX/コマンド)
#contentsx

paste コマンドで複数のファイルの行単位でのマージを行うことができます。
 a
 b
 c
という内容のファイル [file1] があるとします。また、
 1
 2
 3
という内容のファイル [file2] があるとします。
 % paste [file1] [file2]
 a       1
 b       2
 c       3
と表示されます。
オプション -d で出力する delimiter (区切り文字) を指定できます。
デフォルトはタブ文字です。
 % paste -d' ' [file1] [file2]
 a 1
 b 2
 c 3
オプション -s で 1 つのファイルの各行を 1 行に連結できます。
 % paste -s [file1]
 a       b       c

パイプでの出力を1つの入力として受け取りたい場合は - を使えます。- は tar など他のコマンドで使えることも多いです。
 % cat [file1] | paste - [file2]
2つ - - 使用することもできます(同一ファイルを2つ指定したのと同等)

あるファイル群に同一のコマンドを一度にあてる簡単シェルスクリプトを作るのに使えたりもします。
 % find . -name '*.txt' > files.txt
 # a.txt
 # b.txt
 # c.txt
 % yes ./a.out | head -`cat files.txt | wc -l` | paste -d' ' - files.txt > a.sh
 # ./a.out a.txt
 # ./a.out b.txt
 # ./a.out c.txt
 # cat files.txt | wc -l で行数 3 を、yes ./a.out | head -3 で ./a.out を3回出力します
 % sh a.sh
 # コマンドの羅列を sh スクリプトとして実行
ただし、この例に限っていえば
 % find . -name '*.txt' -exec ./a.out \{\} \;
で実行、ファイルを作るのも
 % find . -name '*.txt' -exec echo ./a.out \{\} \; > a.sh
でできますが、何か paste が便利なこともあるかもしれません。[[find]] 参照。

[[join]] も行単位での結合に使用できます。

#navi(UNIX/コマンド,,footer)
xrea