cut・paste入門|列で取り出す・貼り合わせる基本

cut・paste入門|列で取り出す・貼り合わせる基本

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 に任せるのが早道です。

awk入門|テキストを列で切り出す・集計する基本

cut で足りると気づけば一瞬、足りなければ awk へ。この線引きを持っておくだけで、列の操作で立ち止まる時間はぐっと減ります。

最後に

cut は列を縦に切り出し、paste は列を横に貼り合わせる——覚えることはこれだけです。

awk ほどの表現力はないものの、単純な用事なら圧倒的に速く、コマンドも短く済みます

まずは手元の CSV で -f と -d を動かしてみると、感覚はすぐつかめるはず。

以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA