pasteコマンド:複数のファイルを水平方向(横方向)に連結する
pasteコマンド:複数のファイルを水平方向(横方向)に連結する
pasteコマンドについて勉強したことのメモ やりたいこと:2つのファイルの各行を横に並べて、mvコマンドが並んだシェルスクリプトを作りたい
- ファイルA : 現在のファイル一覧のフルパス
- ファイルB : ファイルAの各行のコピー先フルパス
- → "mv ファイルAのN行目 ファイルBのN行目"のファイルを作る
これをlinuxコマンド(bash)で実現
都道府県名のファイルを都道府県庁所在地名のファイルに置換する例で説明します。
スポンサードリンク
目次
結論
こんなコマンドで実現できます。pasteコマンドとsedコマンドを使います。
$ paste -d" " prefecture.txt city.txt | sed -e "s/^/mv /g" > rename.sh
(準備)使用するファイル
このようなファイルがあるとします。
catコマンドでファイルの中身を表示
$ cat prefecture.txt Hokkaido.jpg Aomori.jpg Iwate.jpg Miyagi.jpg Akita.jpg Yamagata.jpg Hukushima.jpg Ibaraki.jpg Tochigi.jpg Gunma.jpg
$ cat city.txt Sapporo.jpg Aomori.jpg Morioka.jpg Sendai.jpg Akita.jpg Yamagata.jpg Hukushima.jpg Mito.jpg Utsunomiya.jpg Maebashi.jpg
pasteコマンド
複数のファイルを水平方向(横方向)に結合します。
- dオプション:区切り文字(デリミタ)を指定します
- 指定しない場合はタブ区切りになります
- "(ダブルクォーテーション)で括って書いた方が安全です
- 半角スペース区切りにするにはダブルクォーテーションが必須で -d" " と書きます
- カンマ区切りなら -d"," もしくは、 -d, と書きます
スペース区切り
スペース区切りで横に繋げるとこうなります。
$ paste -d" " prefecture.txt city.txt Hokkaido.jpg Sapporo.jpg Aomori.jpg Aomori.jpg Iwate.jpg Morioka.jpg Miyagi.jpg Sendai.jpg Akita.jpg Akita.jpg Yamagata.jpg Yamagata.jpg Hukushima.jpg Hukushima.jpg Ibaraki.jpg Mito.jpg Tochigi.jpg Utsunomiya.jpg Gunma.jpg Maebashi.jpg
タブ区切
dオプションを指定しないとこうなります。見やすくなります。
$ paste prefecture.txt city.txt Hokkaido.jpg Sapporo.jpg Aomori.jpg Aomori.jpg Iwate.jpg Morioka.jpg Miyagi.jpg Sendai.jpg Akita.jpg Akita.jpg Yamagata.jpg Yamagata.jpg Hukushima.jpg Hukushima.jpg Ibaraki.jpg Mito.jpg Tochigi.jpg Utsunomiya.jpg Gunma.jpg Maebashi.jpg
カンマ区切り
$ paste -d"," prefecture.txt city.txt Hokkaido.jpg,Sapporo.jpg Aomori.jpg,Aomori.jpg Iwate.jpg,Morioka.jpg Miyagi.jpg,Sendai.jpg Akita.jpg,Akita.jpg Yamagata.jpg,Yamagata.jpg Hukushima.jpg,Hukushima.jpg Ibaraki.jpg,Mito.jpg Tochigi.jpg,Utsunomiya.jpg Gunma.jpg,Maebashi.jpg
pasteとsedコマンドでコマンド一覧を作る
pasteの結果をsedコマンドに渡して、各行の先頭にコマンド(mv)を入れるとmvコマンド一覧を作ります。
$ paste -d" " prefecture.txt city.txt | sed -e "s/^/mv /g" mv Hokkaido.jpg Sapporo.jpg mv Aomori.jpg Aomori.jpg mv Iwate.jpg Morioka.jpg mv Miyagi.jpg Sendai.jpg mv Akita.jpg Akita.jpg mv Yamagata.jpg Yamagata.jpg mv Hukushima.jpg Hukushima.jpg mv Ibaraki.jpg Mito.jpg mv Tochigi.jpg Utsunomiya.jpg mv Gunma.jpg Maebashi.jpg
これをコマンドとして使うと、作業用のコマンド一覧として使えます。
応用編
3ファイル以上を水平結合
引数にファイルを3つ以上書けば、どんどん水平方向に結合できます
$ cat prefecture_ja.txt 北海道 青森 岩手 宮城 秋田 山形 福島 茨城 栃木 群馬 $ cat prefecture.txt Hokkaido.jpg Aomori.jpg Iwate.jpg Miyagi.jpg Akita.jpg Yamagata.jpg Hukushima.jpg Ibaraki.jpg Tochigi.jpg Gunma.jpg $ cat city_ja.txt 札幌 青森 盛岡 仙台 秋田 山形 福島 水戸 宇都宮 前橋 $ cat city.txt Sapporo.jpg Aomori.jpg Morioka.jpg Sendai.jpg Akita.jpg Yamagata.jpg Hukushima.jpg Mito.jpg Utsunomiya.jpg Maebashi.jpg $ paste prefecture_ja.txt prefecture.txt city_ja.txt city.txt 北海道 Hokkaido.jpg 札幌 Sapporo.jpg 青森 Aomori.jpg 青森 Aomori.jpg 岩手 Iwate.jpg 盛岡 Morioka.jpg 宮城 Miyagi.jpg 仙台 Sendai.jpg 秋田 Akita.jpg 秋田 Akita.jpg 山形 Yamagata.jpg 山形 Yamagata.jpg 福島 Hukushima.jpg 福島 Hukushima.jpg 茨城 Ibaraki.jpg 水戸 Mito.jpg 栃木 Tochigi.jpg 宇都宮 Utsunomiya.jpg 群馬 Gunma.jpg 前橋 Maebashi.jpg
3つ以上水平結合時に区切り文字を都度変える
dオプションの中に使う区切り文字を並べて書きます。
(1-2の間)(2-3の間)(3-4の間) のように並べて書くと、それぞれの区切り文字を変えられます。
$ cat prefecture_ja.txt 北海道 青森 岩手 宮城 秋田 山形 福島 茨城 栃木 群馬 $ cat prefecture.txt Hokkaido.jpg Aomori.jpg Iwate.jpg Miyagi.jpg Akita.jpg Yamagata.jpg Hukushima.jpg Ibaraki.jpg Tochigi.jpg Gunma.jpg $ cat city_ja.txt 札幌 青森 盛岡 仙台 秋田 山形 福島 水戸 宇都宮 前橋 $ cat city.txt Sapporo.jpg Aomori.jpg Morioka.jpg Sendai.jpg Akita.jpg Yamagata.jpg Hukushima.jpg Mito.jpg Utsunomiya.jpg Maebashi.jpg paste -d"_ _" prefecture_ja.txt prefecture.txt city_ja.txt city.txt 北海道_Hokkaido.jpg 札幌_Sapporo.jpg 青森_Aomori.jpg 青森_Aomori.jpg 岩手_Iwate.jpg 盛岡_Morioka.jpg 宮城_Miyagi.jpg 仙台_Sendai.jpg 秋田_Akita.jpg 秋田_Akita.jpg 山形_Yamagata.jpg 山形_Yamagata.jpg 福島_Hukushima.jpg 福島_Hukushima.jpg 茨城_Ibaraki.jpg 水戸_Mito.jpg 栃木_Tochigi.jpg 宇都宮_Utsunomiya.jpg 群馬_Gunma.jpg 前橋_Maebashi.jpg
改行(¥n)区切り:交互に行を並べていく
改行文字を区切り文字にすることもできます。
複数ファイルの各行を交互に挿入するのに使えます
ファイルAの1行目 ファイルBの1行目 ファイルCの1行目 ファイルAの2行目 ファイルBの2行目 ファイルCの2行目 ファイルAの3行目 ファイルBの3行目 ファイルCの3行目 ・・・
こんな感じに並べられます
$ cat city_ja.txt 札幌 青森 盛岡 仙台 秋田 山形 福島 水戸 宇都宮 前橋 $ cat city.txt Sapporo.jpg Aomori.jpg Morioka.jpg Sendai.jpg Akita.jpg Yamagata.jpg Hukushima.jpg Mito.jpg Utsunomiya.jpg Maebashi.jpg $ paste -d"\n" city_ja.txt city.txt 札幌 Sapporo.jpg 青森 Aomori.jpg 盛岡 Morioka.jpg 仙台 Sendai.jpg 秋田 Akita.jpg 山形 Yamagata.jpg 福島 Hukushima.jpg 水戸 Mito.jpg 宇都宮 Utsunomiya.jpg 前橋 Maebashi.jpg