Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

joinコマンドが便利過ぎて生きるのが辛い

Linuxシステムプログラミング

Linuxシステムプログラミング

結合

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