OS: Ubuntu 20.04.4 LTS
Excelを持ち合わせていないけれども、CSVファイルの列を操作したい。とりわけ列の抽出や移動をおこないたい。そういう場合はawk
コマンドでこなすと手っ取り早い。
しかし乍ら、awkは「N列目以降を抽出」する場合にfor文が登場して面倒を感ずる。するとcut
やpaste
コマンドの出番となる。処理時間もawkに比べて小さいようにおもう。
列の抽出
次のようなCSVファイルから列を抽出する。
$ cat test.csv 1列目,2列目,3列目,4列目,5列目,6列目,7列目,8列目,9列目,10列目
ここから1列目と3~5列目、8列目以降を抽出したいなら下に掲げる具合になる。「N列目以降」の指定がawkに比べて簡素に記述でき大変ありがたい。
$ cut -d, -f 1,3-5,8- test.csv 1列目,3列目,4列目,5列目,8列目,9列目,10列目
列の移動
5列目と6列目を入れ替えるにあたって、cutコマンドだけで叶えられないか試みたけれども生憎、順番は制御できない模様である。
$ cut -d, -f 1-4,6,5,7- test.csv 1列目,2列目,3列目,4列目,5列目,6列目,7列目,8列目,9列目,10列目
そうするとcutコマンドで列ごとに分割して、pasteコマンドでそれらを結合することになる。しち面倒で到底やっていられない。列数が10程度ならawkコマンドに任せたほうがずっと楽ちんである。
$ awk -F ',' -v 'OFS=,' '{print $1,$2,$3,$4,$6,$5,$7,$8,$9,$10}' test.csv 1列目,2列目,3列目,4列目,6列目,5列目,7列目,8列目,9列目,10列目
列数が多くなるとawkの記述がやっかいになるから、cutとpasteコマンドで成し遂げるほうが見通しが立つ。すなわちこういう塩梅である。
$ cut -d, -f 1-4 test.csv > 1-4.csv $ cut -d, -f 5 test.csv > 5.csv $ cut -d, -f 6 test.csv > 6.csv $ cut -d, -f 7- test.csv > 7-.csv $ paste -d',' 1-4.csv 6.csv 5.csv 7-.csv 1列目,2列目,3列目,4列目,6列目,5列目,7列目,8列目,9列目,10列目
GUI環境があるならCSV+がよいと思う。