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
上記の通り、 \(正規表現\) と \番号 で単語群の入替えを簡単に行うことができます。
スペース区切りで保存されているファイルの列を入れ替える †
スペース区切りで保存してあるファイルの内容を列を逆順にしてみます。
$ 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の列の順序を入れ替える方法の紹介でした。