このエントリーをはてなブックマークに追加


sedコマンドでスペース区切りやCSVの列の順序を入れ替える方法

sedコマンドを使って単語文字列の順書を簡単に入れ替えることができます。
例えば、スペース区切りの文字列群だったり、カンマ区切りの文字列群だったり。
実際には、文字列なしの区切りもあると思うので、
以下紹介の構文では意図した動作にならない場合もあると思いますが、
sedによる文字列の入替えの参考としてください。

関連記事

単語の並び替え(順序の変更)

sedコマンドでは、 \(正規表現\) でヒットした文字列を \1 として使用することがあります。
複数の \(正規表現\) \(正規表現\) \(正規表現\) があった場合、 \1 \2 \3 が対応することになります。

実際に以下で sed コマンドを使って幾つかの動作例を記します。

  • スペース区切りの単語を左右逆にしてみました。
    $ echo "Windows Linux"  | sed 's/\(.*\) \(.*\)/\2 \1/g'
    Linux Windows
  • スペース区切りの単語群の順番を逆にしてみました。
    $ STRING='debian ubuntu centos opensuse'
    $ echo $STRING | sed 's/\(.*\) \(.*\) \(.*\) \(.*\)/\4 \3 \2 \1/g'
    opensuse centos ubuntu debian
  • カンマ区切りの単語を左右逆にしてみました。
    $ echo "Windows,Linux"  | sed 's/\(.*\),\(.*\)/\2,\1/g'
    Linux,Windows
  • カンマ区切りの単語群の順番を逆にしてみました。
    $ STRING='debian,ubuntu,centos,opensuse'
    $ echo $STRING | sed 's/\(.*\),\(.*\),\(.*\),\(.*\)/\4,\3,\2,\1/g'
    opensuse,centos,ubuntu,debian

上記の通り、 \(正規表現\) と \番号 で単語群の入替えを簡単に行うことができます。

スペース区切りで保存されているファイルの列を入れ替える

スペース区切りで保存してあるファイルの内容を列を逆順にしてみます。

$ cat linux.txt 
debian ubuntu centos opensuse
debian ubuntu centos opensuse
  • sedコマンドにファイル名を指定し並び替えを行っています。
    $ sed 's/\(.*\) \(.*\) \(.*\) \(.*\)/\4,\3,\2,\1/g' linux.txt 
    opensuse,centos,ubuntu,debian
    opensuse,centos,ubuntu,debian
  • catコマンドの出力をsedコマンド渡し並び替えを行っています。
    $ cat linux.txt | sed 's/\(.*\) \(.*\) \(.*\) \(.*\)/\4,\3,\2,\1/g'
    opensuse,centos,ubuntu,debian
    opensuse,centos,ubuntu,debian

一行ごとに何らかの処理を行う場合

一行ごとに読み込み、何らかの処理をする場合は、以下ようになると思います。

for L in `cat data.csv`
do
  何らかの処理
done

この場合は、IFSパラメータを設定しないと意図した動作になりません。
以下リンクの記事を参考にしてください。

以上、sedコマンドを使ってスペース区切りやCSVの列の順序を入れ替える方法の紹介でした。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-12-09 (日) 21:32:25