言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Linux & Mac & Bashコマンド辞典

  1. トップページ
  2. Linux & Mac & Bashコマンド辞典
  3. cut / paste / join

cut / paste / join

対応: 全Linux
macOS(2001 Cheetah)
Bash 1.0(1989)

『cut』はファイルの各行から特定の列や文字範囲を切り出し、『paste』は複数ファイルの行を横に並べて貼り合わせ、『join』は共通フィールドをキーにして2つのファイルを結合するコマンドです。

構文

cut [オプション] [ファイル...]
paste [オプション] [ファイル...]
join [オプション] ファイル1 ファイル2

オプション一覧

コマンド / オプション概要
cut -d 区切り -f フィールド番号区切り文字でフィールドを分割して指定番号のフィールドを取り出します。
cut -f 1,31番目と3番目のフィールドを取り出します。
cut -f 1-31〜3番目のフィールドを取り出します。
cut -c 1-5各行の1〜5文字目を取り出します。
paste ファイル1 ファイル22つのファイルの対応する行をタブで区切って横に並べます。
paste -d ',' ファイル1 ファイル2指定した区切り文字で横に並べます。
paste -s ファイルファイルの全行を1行にタブ区切りで並べます。
join ファイル1 ファイル2両ファイルの1列目をキーにして内部結合します(事前に sort が必要)。
join -1 N -2 M ファイル1 ファイル2ファイル1のN列目とファイル2のM列目をキーにして結合します。
join -a 1 ファイル1 ファイル2ファイル1で一致しなかった行も出力します(左外部結合)。

サンプルコード

以下のファイルを例に説明します。

data.csv
user_a,28,Tokyo,engineer
user_b,15,Osaka,designer
user_c,15,Nagoya,manager
names.txt
user_a
user_b
user_c
scores.txt
85
92
78
users.txt
001 user_a
002 user_b
003 user_c
roles.txt
001 engineer
002 designer
003 manager

『cut -d -f』で区切り文字とフィールド番号を指定して列を取り出します。

cut -d',' -f1,3 data.csv
user_a,Tokyo
user_b,Osaka
user_c,Nagoya

『cut -f 1-2』で範囲指定もできます。

cut -d',' -f1-2 data.csv
user_a,28
user_b,15
user_c,15

『cut -c』で文字位置で取り出します。

cut -c1-6 data.csv
user_a
user_b
user_c

『paste』で2つのファイルを横に並べます(タブ区切り)。

paste names.txt scores.txt
user_a	85
user_b	92
user_c	78

『paste -d』で区切り文字を指定します。

paste -d',' names.txt scores.txt
user_a,85
user_b,92
user_c,78

『paste -s』でファイルの全行を1行にまとめます。

paste -s names.txt
user_a	user_b	user_c

『join』で共通フィールドをキーに2つのファイルを結合します(事前にソートが必要)。

join users.txt roles.txt
001 user_a engineer
002 user_b designer
003 user_c manager

よくあるミス

よくあるミス1: -f と -c を混同する

cut の『-f』はフィールド(タブ区切り)、『-c』は文字位置の指定です。混同すると意図しない範囲が切り取られます。

echo "id:name:age" | cut -c 1
i

コロン区切りの2番目フィールドを取り出したい場合は『-d』で区切り文字を指定してから『-f』を使います。

echo "id:name:age" | cut -d':' -f 2
name

よくあるミス2: クォートを含む CSV に cut を使う

cut はフィールド内のクォートを理解しません。クォートされたカンマが含まれる CSV では正しく分割できません。

echo '"data_a","location, city",28' | cut -d',' -f 2
"location

クォートを含む CSV の処理には awk や Python が適しています。

概要

$ cut』は単純なフィールド抽出に便利ですが、フィールド内に区切り文字が含まれる場合(クォートされたCSVなど)は正しく処理できません。そのような複雑なケースでは『awk』を使います。

フィールドのカウントや並び替えには『sort』も参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。