サイト内検索:
loopj : 複数のテキストファイルの全てのレコードを連結する
loopj = loop of join3
使い方とオプション
loopj [-d<string>] num=<num> <file1> <file2> ..
引数で指定した複数のファイルを、第1フィールドから num=<n> で指定したフィールドまでをキーにして全て連結します。各ファイルの中でキーフィールドがマッチングしないレコードについては、それぞれ “0” でフィールドを補完します。
連結する各ファイルは0バイトより大きく、キーとなるフィールドはユニークかつ昇順でソートされていることが条件になります。
<file> が0バイトファイルの場合エラーとなります。
基本的な使い方
(file1)
0000003 杉山______ A
0000005 崎村______ B
0000007 梶川______ C
0000010 柳本______ D
(file2)
0000000 50
0000003 26
0000004 40
0000009 68
(file3)
0000000 F
0000003 F
0000004 M
0000005 F
3つのファイルを連結する。
$ loopj num=1 file1 file2 file3 > data
(data)
0000000 0 0 50 F
0000003 杉山______ A 26 F
0000004 0 0 40 M
0000005 崎村______ B 0 F
0000007 梶川______ C 0 0
0000009 0 0 68 0
0000010 柳本______ D 0 0
ファイル名が “-” の場合は標準入力を連結します。
$ cat file2 | loopj num=1 file1 - file3
-d オプション 補完する文字列を指定できます。
$ loopj -d@@@ num=1 file1 file2 file3 > data
$ cat data
0000000 @@@ @@@ 50 F
0000003 杉山______ A 26 F
0000004 @@@ @@@ 40 M
0000005 崎村______ B @@@ F
0000007 梶川______ C @@@ @@@
0000009 @@@ @@@ 68 @@@
0000010 柳本______ D @@@ @@@
キーのみを持つファイルを連結すると、値のみを補完します。
$ cat file1
0001 1
0002 2
$ cat file2
0001
0002
0003
0004
$ loopj num=1 file1 file2 あるいは
$ loopj num=1 file2 file1
0001 1
0002 2
0003 0
0004 0
$ loopj num=1 file2 file2
0001
0002
0003
0004
連結するファイルが0バイトの時はエラーになります。
$ : > data1
$ cat data2
a 1
b 2
c 3
$ loopj num=1 data1 data2
Error(605)[loopj] : cannot join empty file(data1).
上記の例で data1 が例えば3フィールドあることを保証するには
$ [ ! -s data1 ] && echo x 0 0 > data1
$ loopj num=1 data1 data2 | awk '$1 !~ /x/'
a 0 0 1
b 0 0 2
c 0 0 3
Version : Thu Jan 14 11:01:02 JST 2021
Edition : 1
© 2021 Universal Shell Programming Laboratory site