使用键/连接列中的重复条目执行完全外连接的命令

Aru*_*han 0 unix scripting awk

我有三个文件。我需要根据一列加入它们并执行一些转换。

file1.dat(第1列用于加入)

123,is1,ric1,col1,smbc1  
123,is2,ric1,col1,smbc1  
234,is3,ric3,col3,smbc2  
345,is4,ric4,,smbc2  
345,is4,,col5,smbc2 
Run Code Online (Sandbox Code Playgroud)

file2.dat(第1列用于加入)

123,abc  
234,bcd  
Run Code Online (Sandbox Code Playgroud)

file3.dat(第4列用于加入)

r0c1,r0c2,r0c3,123,r0c5,r0c6,r0c7,r0c8  
r2c1,r2c2,r2c3,123,r2c5,r2c6,r2c7,r2c8  
r3c1,r3c2,r3c3,234,r3c5,r3c6,r3c7,r3c8  
r4c1,r4c2,r4c3,345,r4c5,r4c6,r4c7,r4c8   
Run Code Online (Sandbox Code Playgroud)

预期输出 (output.dat)

123,r0c5,is1,ric1,smbc1,abc,r0c8,r0c6,col1,r0c7,r0c1,r0c2,r0c3  
123,r0c5,is2,ric1,smbc1,abc,r0c8,r0c6,col1,r0c7,r0c1,r0c2,r0c3  
123,r2c5,is1,ric1,smbc1,abc,r2c8,r2c6,col1,r2c7,r2c1,r2c2,r2c3  
123,r2c5,is2,ric1,smbc1,abc,r2c8,r2c6,col1,r2c7,r2c1,r2c2,r2c3  
234,r3c5,is3,ric3,smbc2,bcd,r3c8,r3c6,col3,r3c7,r3c1,r3c2,r3c3  
345,r4c5,is4,ric4,smbc2,N/A,r4c8,r4c6,N/A,r4c7,r4c1,r4c2,r4c3  
345,r4c5,is4,N/A,smbc2,N/A,r4c8,r4c6,col5,r4c7,r4c1,r4c2,r4c3 
Run Code Online (Sandbox Code Playgroud)

我写了以下 awk 命令。

awk '
BEGIN {FS=OFS=","}
FILENAME == ARGV[1] { temp_join_one[$1] = $2"|"$3"|"$4"|"$5; next}
FILENAME == ARGV[2] { exchtbunload[$1] = $2; next}
FILENAME == ARGV[3] { s_temp_join_one = temp_join_one[$4];
split(s_temp_join_one, array_temp_join_one,"|");
v3=(array_temp_join_one[1]==""?"N/A":array_temp_join_one[1]);
v4=(array_temp_join_one[2]==""?"N/A":array_temp_join_one[2]);
v5=(array_temp_join_one[4]==""?"N/A":array_temp_join_one[4]);
v6=(exchtbunload[$4]==""?"N/A":exchtbunload[$4]);
v9=(array_temp_join_one[3]==""?"N/A":array_temp_join_one[3]);
v11=($2=""?"N/A":$2);
print $4, $5, v3, v4, v5, v6, $8, $6, v9, $7, $1, v11, $3 >
"output.dat" }
' file1.dat file2.dat file3.dat
Run Code Online (Sandbox Code Playgroud)

我需要加入所有三个文件。

最终输出文件应包含 file3 中的所有值,而不管它们是否在其他两个文件中,如果其他两个文件中不存在相应列,则相应列应为空(或 N/A)。(列的顺序不是一个很大的问题。我可以使用 awk 重新排列它们。)

但我的问题是,由于密钥不是唯一的,我没有得到预期的输出。我的输出只有三行。

我尝试应用使用连接条件建议的解决方案。它适用于较小的文件。但是我拥有的文件大小接近 3-5 GB。它们按数字顺序排列,而不是按字典顺序排列。对它们进行排序看起来需要很多时间。

任何建议都会有所帮助。

提前致谢。

kar*_*kfa 5

with join,假设文件按键排序。

$ join -t, -1 1 -2 4 <(join -t, -a1 -a2 -e "N/A" -o1.1,1.2,1.3,1.4,1.5,2.1 file1 file2) \
  file3 -o1.1,2.5,1.2,1.3,1.5,1.6,2.8,2.6,1.4,2.7,2.2,2.3

123,r0c5,is1,ric1,smbc1,123,r0c8,r0c6,col1,r0c7,r0c2,r0c3
123,r2c5,is1,ric1,smbc1,123,r2c8,r2c6,col1,r2c7,r2c2,r2c3
123,r0c5,is2,ric1,smbc1,123,r0c8,r0c6,col1,r0c7,r0c2,r0c3
123,r2c5,is2,ric1,smbc1,123,r2c8,r2c6,col1,r2c7,r2c2,r2c3
234,r3c5,is3,ric3,smbc2,234,r3c8,r3c6,col3,r3c7,r3c2,r3c3
345,r4c5,is4,ric4,smbc2,N/A,r4c8,r4c6,N/A,r4c7,r4c2,r4c3
345,r4c5,is4,N/A,smbc2,N/A,r4c8,r4c6,col5,r4c7,r4c2,r4c3
Run Code Online (Sandbox Code Playgroud)