Dear Gordon, Thank you for your reply.
First, it is the field of File 2, but because of the editor it has become four fields, but in fact ==> File 2 <== [email protected] 1 password-1 [email protected] 2 password-2 I thought that I wanted to match the number of fields combined with the next option to File 2 in three fields. "-o 0 2.2 2.3" Next is the correct answer. [File 1] [email protected] [email protected] [email protected] - [File 2] [email protected] 1 password-1 [email protected] 2 password-2 - [Expected results] [email protected] 0 PASSWORD-0 [email protected] 2 password-2 [email protected] 1 password-1 I understand that processing is possible using awk or sed. However, I would like to know about the specification of "join -e" option, whether there is a function to supplement two fields missing in File1. Thank you. > -----Original Message----- > From: Assaf Gordon [mailto:[email protected]] > Sent: Friday, March 31, 2017 12:09 AM > To: Goto, Ryoichi <[email protected]> > Cc: [email protected] > Subject: Re: When specifying multiple elements with "-e" option of join > command > > Hello, > > > On Mar 30, 2017, at 01:41, Goto, Ryoichi <[email protected]> wrote: > > > > [...] > > I tried executing the following command, but the record "[email protected]" > which exists only in File 1 has two pairs of > character strings specified by "-e" output. > > $ Join -1 1 - o 0 2.2 2.3 - a 1 - e "0 PASSWORD 0" <(sort File 1) > > <(sort File 2) > > > > [Actual result] > > Jiro @ yahoo.jp 0 PASSWORD 0 0 PASSWORD 0 [email protected] 2 password 2 > > [email protected] 1 password 1 > > > > If you remove the double quotes from the command line you ran, "join: > extra operator '/ dev / fd / 62'" and an unknown > error will be displayed and say "- e 0 - e PASSWORD 0" The syntax is also an > error. > > The "-e" parameter fills missing fields with the given value. The second > file has 4 fields, and after the join 3 fields > are missing - so the string you've set to "-e" appears multiple times. > > Notice the following: > > $ head * > ==> file1 <== > [email protected] > [email protected] > [email protected] > > ==> file2 <== > [email protected] 1 password 1 > [email protected] 2 password 2 > > $ join -o auto -e MISSING -a 1 -j1 <(sort file1) <(sort file2) > [email protected] 2 password 2 > [email protected] MISSING MISSING MISSING > [email protected] 1 password 1 > > I can suggest two work-arounds, which work with your specific files: > > Option #1: > Because 'file1' has only one field, we know implicitly that any joined line > which still has one field in the output did > not have a matching record in the second file. > Then, a simple AWK script can add the needed password: > > $ join -a 1 -j1 <(sort file1) <(sort file2) > [email protected] 2 password 2 > [email protected] > [email protected] 1 password 1 > > $ join -a 1 -j1 <(sort file1) <(sort file2) \ > | awk 'NF==1 { print $0, "0 password 0" } NF!=1 { print }' > [email protected] 2 password 2 > [email protected] 0 password 0 > [email protected] 1 password 1 > > > Option #2: > Use "-e" to mark lines with missing values, then detect and replace then > with sed: > > $ join -o auto -e XX -a 1 -j1 <(sort file1) <(sort file2) > [email protected] 2 password 2 > [email protected] XX XX XX > [email protected] 1 password 1 > > $ join -o auto -e XX -a 1 -j1 <(sort file1) <(sort file2) \ > | sed 's/XX XX XX/0 password 0/' > [email protected] 2 password 2 > [email protected] 0 password 0 > [email protected] 1 password 1 > > > Of course these are just examples which can be used as basis for similar > variations. > > Hope this helps, > > regards, > - assaf
