【Linux】cutコマンドで列を切り出す方法|-d/-f・連続スペースの罠・awkとの違い

cutは、テキストの各行から特定の「列」を切り出すコマンドです。CSVの2列目だけ取り出す、/etc/passwdからユーザー名だけ抜き出す、といった「表形式データの列抽出」を手軽に行えます。awkでも同じことができますが、単純な列抽出ならcutのほうが短く書けて分かりやすいため、使い分けられると便利です。

ただし、cutには知らないとハマる2つの制約があります。1つは区切り文字が「1文字」しか指定できず、連続したスペースをまとめてくれないこと。もう1つはフィールドの順序を入れ替えられないことです。この記事では、実機のLinux(WSLのDebian)でこれらの罠を実際に再現しながら、cutの使い方とawkとの使い分けを整理します。

先に結論

  • cut -d区切り文字 -fフィールド番号で、指定した列を抽出します。
  • -cで文字位置(例: -c1-3で1〜3文字目)を切り出せます。
  • 区切り文字は「1文字」だけ連続スペースはまとめないので、スペース区切りでは崩れます
  • スペース区切りや複雑な整形はawkのほうが得意です。
  • フィールドの順序は入れ替えられません-f3,1でも1,3順で出ます)。
  • 出力の区切りを変えるには--output-delimiterを使います。

より高度な列処理・集計はawk、文字列の検索はgrep、結果の並べ替えはsort・uniqもあわせて参考になります。

スポンサーリンク

cutの基本:区切り文字とフィールド(-d / -f)

もっとも一般的な使い方が、-dで区切り文字、-fでフィールド(列)番号を指定する方法です。CSV(カンマ区切り)やコロン区切りのデータから、欲しい列だけを取り出せます。

-d と -f で列を抽出
cat data.csv
# taro,30,tokyo
# hanako,25,osaka

# -d, で区切りをカンマに、-f1 で1列目を抽出
cut -d, -f1 data.csv
# taro
# hanako

# 複数列はカンマで指定(1列目と3列目)
cut -d, -f1,3 data.csv
# taro,tokyo
# hanako,osaka

# 範囲指定もできる(2〜4列目)
echo "1:2:3:4:5" | cut -d: -f2-4
# 2:3:4

実機でも、cut -d, -f1CSVの1列目(名前)だけを抽出でき、cut -d, -f1,31列目と3列目cut -d: -f2-42〜4列目の範囲を取り出せることを確認しました。-dで「何を区切りとみなすか」、-fで「何列目を取るか」を指定するだけのシンプルな構造です。/etc/passwd(コロン区切り)からユーザー名を取り出すcut -d: -f1 /etc/passwdは定番の使い方です。

文字位置で切り出す(-c)

区切り文字ではなく、「各行の何文字目から何文字目まで」という文字位置で切り出すには-cを使います。固定長のデータやログの整形に便利です。

-c で文字位置を切り出す
# 1〜3文字目を切り出す
echo "ABCDEFGH" | cut -c1-3
# ABC

# 5文字目以降をすべて
echo "ABCDEFGH" | cut -c5-
# EFGH

# 日付から年だけ取り出す(1〜4文字目)
echo "2026-07-11" | cut -c1-4
# 2026

実機でも、cut -c1-3先頭3文字(ABC)cut -c5-5文字目以降(EFGH)を切り出せることを確認しました。-cは「桁がそろっている固定長データ」で真価を発揮します。ただし日本語(マルチバイト文字)では、環境によって「文字」と「バイト」の扱いが変わることがあるため、日本語を含むデータでの文字位置指定には注意が必要です。

【最重要】連続スペースで崩れる罠

cutで最も注意すべき制約がこれです。-dで指定できる区切り文字は「1文字」だけで、しかも連続した区切り文字をまとめてくれません。そのため、スペースが複数連なっているデータをcut -d' 'で処理すると、意図しない結果になります。

スペース区切りの罠(再現)
# 名前と数値が「複数のスペース」で区切られたデータ
cat spaces.txt
# taro   30      ← 間に3つのスペース

# cut で2列目(数値)を取ろうとすると…
cut -d' ' -f1 spaces.txt
# taro          ← 1列目はOK

cut -d' ' -f2 spaces.txt
#               ← 空になる!(2つ目の区切りは「2個目のスペース」なので中身が空)

# awk なら連続スペースをまとめて扱うので正しく取れる
awk '{print $2}' spaces.txt
# 30            ← 正しく取れる
スペース区切りはcutでは崩れる・awkを使う(実証)

実機で、taro303つのスペースで区切られたデータを用意して確認しました。cut -d' ' -f1で1列目のtaroは取れましたが、cut -d' ' -f2は空になりました。これは、cut「1個目のスペース」と「2個目のスペース」の間を2番目のフィールドとみなすためで、そこには何もないので空になるのです。一方、awkawk '{print $2}'とすると、連続する空白を1つの区切りとしてまとめて扱うため、正しく30が取れました。「スペース区切り(特に桁揃えのために連続スペースが入るデータ)はcutではなくawkというのが鉄則です。cutが得意なのは、カンマやコロンのように「区切りが必ず1文字ずつ」のきれいなデータです。psls -lの出力のように空白幅がまちまちな表は、awkで処理してください。

【罠】順序は入れ替えられない

もう一つの制約です。cut -f3,1のように「3列目、1列目の順で」と指定しても、cutは常に元の順序(1列目、3列目)で出力します。列の順序を入れ替えたいときはcutでは実現できません。

順序入れ替えはできない(実証)
# 3列目・1列目の順で出したいつもりで指定しても…
echo "a,b,c" | cut -d, -f3,1
# a,c           ← 指定順(3,1)は無視され、常に元の順(1,3)で出る

# 順序を入れ替えたいなら awk を使う
echo "a,b,c" | awk -F, '{print $3","$1}'
# c,a           ← awk なら自由な順序で出せる

実機でも、cut -d, -f3,1指定した順序(3,1)を無視して、元の並び(1,3)でa,cと出力しました。「列の順序を入れ替えて出力したい」場合は、cutでは不可能で、awk -F, '{print $3","$1}'のようにawkを使う必要があります。cutは「決まった列を、元の順序のまま、素早く抜く」ことに特化したコマンドだと理解しておくと、awkとの使い分けが明確になります。

出力の区切りを変える(--output-delimiter)

抽出した列を、元とは違う区切り文字でつなげて出力したいときは--output-delimiterを使います。

出力区切りの変更
# カンマ区切りを、パイプ区切りにして出力
echo "a,b,c" | cut -d, -f1,3 --output-delimiter=' | '
# a | c

# タブ区切りに変換する例
cut -d, -f1,2 data.csv --output-delimiter=$'\t'

実機でも、--output-delimiter=' | 'を指定すると、抽出した1列目と3列目が | でつながって出力されることを確認しました。入力の区切り(-d)と出力の区切りを別にできるため、CSVをタブ区切り(TSV)に変換するといった簡単な整形にも使えます。ただし、こうした変換や整形が複雑になってくると、やはりawkのほうが柔軟です。

主な書き方一覧

cutの要点をまとめます。

書き方 働き
cut -d, -f1 カンマ区切りの1列目を抽出
cut -d, -f1,3 複数列(1列目と3列目)
cut -d: -f2-4 範囲(2〜4列目)
cut -c1-3 文字位置(1〜3文字目)
--output-delimiter 出力の区切りを変更
連続スペース / 順序入替 cutは不可 → awkを使う

よくある失敗

スペース区切りのデータで列がずれる・空になる

cutは連続スペースをまとめません。スペース区切りはawkを使います。

列の順序を入れ替えて出力しようとする

cutは元の順序でしか出せません。順序変更はawkが必要です。

-dに2文字以上を指定する

区切り文字は1文字だけです。複数文字の区切りはawkやsedで処理します。

-fと-cを混同する

-fはフィールド(区切りで分けた列)、-cは文字位置です。

日本語データで-cの文字位置がずれる

マルチバイト文字では文字とバイトの扱いに注意が必要です。awkやその他の方法を検討します。

よくある質問

Qcutで特定の列だけ取り出すには?
Acut -d区切り文字 -fフィールド番号を使います。たとえばカンマ区切りの1列目ならcut -d, -f1、コロン区切りの2〜4列目ならcut -d: -f2-4です。実機でも、CSVやコロン区切りのデータから指定した列を正しく抽出できることを確認しています。
Qcutでスペース区切りのデータがうまく切り出せません。
Acutの区切り文字は1文字だけで、連続したスペースをまとめてくれないためです。桁揃えで複数のスペースが入っているデータでは、2番目以降のフィールドが空になることがあります(実機でも確認済み)。この場合は、連続空白をまとめて扱うawkawk '{print $2}')を使ってください。
Qcutとawkはどう使い分けますか?
Aカンマやコロンのように区切りが1文字ずつきれいに入ったデータから、決まった列を素早く抜くならcutが手軽です。一方、スペース区切り(連続空白あり)、列の順序を入れ替えたい、条件で絞り込みたい、計算したい、といった複雑な処理はawkが向いています。
Qcutで列の順序を入れ替えられますか?
Aできません。cut -f3,1のように指定しても、常に元の順序(1列目、3列目)で出力されます。実機でも、-f3,1a,c(元の順)で出ることを確認しています。順序を入れ替えたい場合はawk -F, '{print $3,$1}'のようにawkを使ってください。
Q文字数(位置)で切り出すには?
Acut -cを使います。cut -c1-3で1〜3文字目、cut -c5-で5文字目以降を切り出せます。固定長のデータやログの整形に便利です。ただし日本語などのマルチバイト文字では、環境によって文字とバイトの扱いが変わることがあるため注意してください。

まとめ

  • cut -d区切り -fフィールドで列を抽出、-cで文字位置を切り出します。
  • 区切り文字は1文字だけ・連続スペースはまとめないため、スペース区切りはawkを使います。
  • 列の順序は入れ替えられません。順序変更もawkの役割です。
  • 出力の区切りは--output-delimiterで変更できます。
  • cutは「きれいな区切りデータから決まった列を素早く抜く」のが得意です。

cutは、シンプルな列抽出を最短で書ける便利なコマンドです。「きれいな区切りはcut、複雑ならawk」という使い分けを覚えておけば、テキストデータの加工がぐっと楽になります。抽出した結果はsort・uniqで集計したり、grepで絞り込んだりと、パイプでつないで活用しましょう。