joinコマンドが便利過ぎて生きるのが辛い
- 作者: Robert Love,ロバートラブ,千住治郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/04/16
- メディア: 大型本
- 購入: 5人 クリック: 181回
- この商品を含むブログ (29件) を見る
結合
Unix/Linuxの標準コマンドで2つのファイルの共通keyで連結することができます。共通keyでの結合にはjoinコマンドを利用します。joinによりSQLのinner joinに近いことがコマンドだけで出来てしまいます。今までテキスト処理をコマンドで行う事が少なかったのでjoinの活用方法を知りませんでしたが、今回調べた内容を記録します。似たコマンドとしてpasteというものもあり、こちらは同じ行数の内容を単純に結合します。そちらについても簡単に紹介します。
join
join前にsort
joinコマンドを利用する場合は2つのファイルがそれぞれ結合するフィールドでsortしておく必要があります。sortしないで実行すると期待通りの結果が得られません。
joinコマンドオプション
オプション 役割 -1 n File1のn番目のフィールドを用いてjoinする -2 n File2のn番目のフィールドを用いてjoinする -a File ファイルにあるペアにならなかった行を通常の出力に追加 -e string 入力にFieldがなかった場合はそれに対応する出力フィールドをstringにする -i, --inore-case キーを比較する時に英大文字小文字の違いを無視 -j n -1 n ,-2 nと同じ -o Field-list 出力のフォーマットにField-listを用いる -t char 入力/出力フィールド区切り文字にcharを指定 -v File ペアにならなかった行だけを出力 先頭カラムでjoin
$ cat AA.txt AA 100円 BB 300円 CC 200円 DD 400円 EE 500円 $ cat BB.txt AA Category1 BB Category2 CC Category3 DD Category4 $ join AA.txt BB.txt AA 100円 Category1 BB 300円 Category2 CC 200円 Category3 DD 400円 Category4結合カラムを指定してjoin
$ cat AA.txt AA 100円 BB 300円 CC 200円 DD 400円 EE 500円 $ cat BB.txt labelA AA Category1 labelB BB Category2 labelC CC Category3 labelD DD Category4 $ join -1 1 -2 2 AA.txt BB.txt AA 100円 labelA Category1 BB 300円 labelB Category2 CC 200円 labelC Category3 DD 400円 labelD Category4ペアにならなかった行も含めて結合
$ cat AA.txt AA 100円 BB 300円 CC 200円 DD 400円 EE 500円 $ cat BB.txt labelA AA Category1 labelB BB Category2 labelC CC Category3 labelD DD Category4 $ join -1 1 -2 2 -a 1 AA.txt BB.txt AA 100円 labelA Category1 BB 300円 labelB Category2 CC 200円 labelC Category3 DD 400円 labelD Category4 EE 500円ペアにならなかった行だけ出力
$ cat AA.txt AA 100円 BB 300円 CC 200円 DD 400円 EE 500円 $ cat BB.txt labelA AA Category1 labelB BB Category2 labelC CC Category3 labelD DD Category4 $ join -1 1 -2 2 -v 1 AA.txt BB.txt EE 500円keyの大文字/小文字を無視
$ cat AA.txt AA 100円 BB 300円 CC 200円 DD 400円 EE 500円 $ cat BB.txt labelA aa Category1 labelB bb Category2 labelC cc Category3 labelD dd Category4 $ join -1 1 -2 2 -i AA.txt BB.txt AA 100円 labelA Category1 BB 300円 labelB Category2 CC 200円 labelC Category3 DD 400円 labelD Category4
paste
pasteコマンドオプション
オプション 役割 -d delim-list, delimiters=delim-list ファイル間の結合を ではなく、delim-listを順番に利用 -s, --serial ファイル単位で 1 行にまとめていく 単純なpaste
$ cat AA.txt AA 100円 BB 300円 CC 200円 DD 400円 EE 500円 $ cat BB.txt labelA AA Category1 labelB BB Category2 labelC CC Category3 labelD DD Category4 $ paste AA.txt BB.txt AA 100円 labelA AA Category1 BB 300円 labelB BB Category2 CC 200円 labelC CC Category3 DD 400円 labelD DD Category4 EE 500円delimiterを指定してpaste
$ cat AA.txt AA 100円 BB 300円 CC 200円 DD 400円 EE 500円 $ cat BB.txt labelA AA Category1 labelB BB Category2 labelC CC Category3 labelD DD Category4 $ paste -d ' ' AA.txt BB.txt AA 100円 labelA AA Category1 BB 300円 labelB BB Category2 CC 200円 labelC CC Category3 DD 400円 labelD DD Category4 EE 500円ファイルを1行にまとめて行を追加
$ cat AA.txt AA 100円 BB 300円 CC 200円 DD 400円 EE 500円 $ cat BB.txt labelA AA Category1 labelB BB Category2 labelC CC Category3 labelD DD Category4 $ paste -s AA.txt BB.txt AA 100円 BB 300円 CC 200円 DD 400円 EE 500円 labelA AA Category1 labelB BB Category2 labelC CC Category3 labelD DD Category4