pwd-it:IT資格の勉強ブログ

IT系資格の勉強に役立つ情報などを共有していきたいと思います

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

スポンサードリンク