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,3 | 1番目と3番目のフィールドを取り出します。 |
| cut -f 1-3 | 1〜3番目のフィールドを取り出します。 |
| cut -c 1-5 | 各行の1〜5文字目を取り出します。 |
| paste ファイル1 ファイル2 | 2つのファイルの対応する行をタブで区切って横に並べます。 |
| 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』も参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。