cut / paste / join
| 対応: | 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
五条悟,28,Tokyo,engineer 虎杖悠仁,15,Osaka,designer 伏黒恵,15,Nagoya,manager
names.txt
五条悟 虎杖悠仁 伏黒恵
scores.txt
85 92 78
users.txt(IDでソート済み)
001 五条悟 002 虎杖悠仁 003 伏黒恵
roles.txt(IDでソート済み)
001 engineer 002 designer 003 manager
『cut -d -f』で区切り文字とフィールド番号を指定して列を取り出します。
cut -d',' -f1,3 data.csv 五条悟,Tokyo 虎杖悠仁,Osaka 伏黒恵,Nagoya
『cut -f 1-2』で範囲指定もできます。
cut -d',' -f1-2 data.csv 五条悟,28 虎杖悠仁,15 伏黒恵,15
『cut -c』で文字位置で取り出します。
cut -c1-3 data.csv 五条悟 虎杖悠 伏黒恵
『paste』で2つのファイルを横に並べます(タブ区切り)。
paste names.txt scores.txt 五条悟 85 虎杖悠仁 92 伏黒恵 78
『paste -d』で区切り文字を指定します。
paste -d',' names.txt scores.txt 五条悟,85 虎杖悠仁,92 伏黒恵,78
『paste -s』でファイルの全行を1行にまとめます。
paste -s names.txt 五条悟 虎杖悠仁 伏黒恵
『join』で共通フィールドをキーに2つのファイルを結合します(事前にソートが必要)。
join users.txt roles.txt 001 五条悟 engineer 002 虎杖悠仁 designer 003 伏黒恵 manager
概要
『$ cut』は単純なフィールド抽出に便利ですが、フィールド内に区切り文字が含まれる場合(クォートされたCSVなど)は正しく処理できません。そのような複雑なケースでは『awk』を使います。
フィールドのカウントや並び替えには『sort』も参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。