我有一列的 name.txt 文件,例如
A
B
C
D
E
F
Run Code Online (Sandbox Code Playgroud)
然后我有很多文件,egxtxt, y.txt 和 z.txt
x.txt 有
A 1
C 3
D 2
Run Code Online (Sandbox Code Playgroud)
y.txt 有
A 1
B 4
E 3
Run Code Online (Sandbox Code Playgroud)
z.txt 有
B 2
D 2
F 1
Run Code Online (Sandbox Code Playgroud)
理想的输出是(如果没有映射就填0)
A 1 1 0
B 0 4 2
C 3 0 0
D 2 0 2
E 0 3 0
F 0 0 1
Run Code Online (Sandbox Code Playgroud)
可以用bash制作吗?(也许是 awk?)
非常感谢!!!
第一次编辑 - 我的尝试性工作
由于我对 bash 还很陌生,所以我真的很难用 awk 找出可能的解决方案。我更熟悉R,可以通过
namematrix[namematrix[,1]==xmatrix[,1],]
Run Code Online (Sandbox Code Playgroud)
总而言之,我真的很感谢下面的帮助,帮助我更多地了解awk和join!
第二次编辑 …
假设我有两个文件,en.csv并且sp.csv,每个都包含正好两个逗号分隔的记录:
en.csv:
1,dog,red,car
3,cat,white,boat
Run Code Online (Sandbox Code Playgroud)
sp.csv:
2,conejo,gris,tren
3,gato,blanco,bote
Run Code Online (Sandbox Code Playgroud)
如果我执行
join -t, -a 1 -a 2 -e MISSING en.csv sp.csv
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
1,dog,red,car
2,conejo,gris,tren
3,cat,white,boat,gato,blanco,bote
Run Code Online (Sandbox Code Playgroud)
请注意,所有缺少的字段都已折叠.要获得"正确的"全外连接,我需要指定一种格式; 从而
join -t, -a 1 -a 2 -e MISSING -o 0,1.2,1.3,1.4,2.2,2.3,2.4 en.csv sp.csv
Run Code Online (Sandbox Code Playgroud)
产量
1,dog,red,car,MISSING,MISSING,MISSING
2,MISSING,MISSING,MISSING,conejo,gris,tren
3,cat,white,boat,gato,blanco,bote
Run Code Online (Sandbox Code Playgroud)
这种方式产生完全外连接的一个缺点是一个需要明确指定了决赛桌,这可能不容易编程的应用(如连接表的身份只有在运行时是已知的)做的格式.
最近版本的GNU join通过支持特殊格式消除了这个缺点auto.因此,join上面的最后一个命令的这种版本可以被更普遍的替换
join -t, -a 1 -a 2 -e MISSING -o auto en.csv sp.csv
Run Code Online (Sandbox Code Playgroud)
如何join在不支持该-o auto选项的版本中实现同样的效果?
背景和细节
我有一个Unix shell(zsh)脚本,用于处理多个CSV平面文件,并通过广泛使用GNU join的'-o auto'选项来实现.我需要修改这个脚本,以便它可以在可用 …