grep・sed・awk と、テキストを加工するコマンドを何度か取り上げてきました。
ただ「CSV の 2列目だけ欲しい」くらいの単純な用事だと、awk はやや大げさに感じます。
そんな列の抜き差しをサッと片づけるのが、今回の cut と paste です。
cut:列を「縦に」切り出す
cut は行を区切り文字で分割し、指定した列だけを抜き出すコマンド。
# emp.csv の 2列目(name)と 4列目(salary)だけ取り出す
cut -d',' -f2,4 emp.csv
#=> name,salary
# sato,300
# suzuki,420
-d で区切り文字、-f で欲しいフィールド番号を指定します。上の例なら 2列目と 4列目だけが残りました。
文字数で切りたいときは -c を使います。
# 文字位置で切る(先頭3文字)
echo 'abcdef' | cut -c1-3 #=> abc
# 区切りを省くと既定はタブ(TSV向き)
printf 'x\ty\tz\n' | cut -f2 #=> y
ここで 区切り文字を省くと、既定はカンマではなくタブになる点に注意してください。CSV を触るときは -d’,’ を忘れがちです。
もうひとつ、初見でハマりやすい癖があります。
# -f3,1 と書いても「3→1」に並べ替えはされない
echo 'A,B,C' | cut -d',' -f3,1 #=> A,C (C,A にはならない)
-f3,1 と書いても列は並べ替わらず、ファイルの順序のまま出てきます。並べ替えたいなら別のコマンドの出番です。
paste:列を「横に」貼り合わせる
paste は cut とは逆で、複数のファイルを列として横に連結します。
# 2つの列ファイルを横に連結(既定はタブ区切り)
paste col1.txt col2.txt
# 区切りをカンマにする
paste -d',' col1.txt col2.txt
#=> a,1
# b,2
# c,3
既定はタブ区切りで、-d を付ければ区切り文字を変えられます。2つの列ファイルが、ひとつの表になりました。
地味に便利なのが -s オプションです。
# 縦の1列を 1行の横並びに畳む(転置)
paste -s -d',' col1.txt
#=> a,b,c
縦に並んだ 1列を、1行の横並びに畳んでくれます。ログの値をカンマ区切りで 1行にまとめたいとき、これが効きます。
迷ったら「単純作業は cut / paste、複雑なら awk」
cut と paste は、あくまで 単純な列操作の専用ツールと割り切ると使いやすいです。
複数スペース区切りをうまく扱えない、列を並べ替えられない、条件で絞ったり集計したりもできない——このあたりは cut の守備範囲を超えます。
そうした一歩踏み込んだ加工は、同じ列指向でも表現力のある awk に任せるのが早道です。
cut で足りると気づけば一瞬、足りなければ awk へ。この線引きを持っておくだけで、列の操作で立ち止まる時間はぐっと減ります。
最後に
cut は列を縦に切り出し、paste は列を横に貼り合わせる——覚えることはこれだけです。
awk ほどの表現力はないものの、単純な用事なら圧倒的に速く、コマンドも短く済みます。
まずは手元の CSV で -f と -d を動かしてみると、感覚はすぐつかめるはず。
以上です。










コメントを残す