cutとpasteコマンドでCSVファイルの列を操作

OS: Ubuntu 20.04.4 LTS

Excelを持ち合わせていないけれども、CSVファイルの列を操作したい。とりわけ列の抽出や移動をおこないたい。そういう場合はawkコマンドでこなすと手っ取り早い。

しかし乍ら、awkは「N列目以降を抽出」する場合にfor文が登場して面倒を感ずる。するとcutpasteコマンドの出番となる。処理時間も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+がよいと思う。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください