我有两个输入文件
file1
A 0.01
B 0.09
D 0.05
F 0.08
file2
A 0.03
C 0.01
D 0.04
E 0.09
我想要的输出是
A 0.01 0.03 1
B 0.09 NULL 1
C NULL 0.01 1
D 0.05 0.04 1
E NULL 0.09 1
F 0.08 NULL 1
这就是我到目前为止所做的
join -t $'t' -a 1 -a 2 -1 1 -2 1 -e NULL -o 0,1.2,2.2,'1' file1 file2
这给了我
join: invalid field specifier: `1'
我不会使用join,有无数的工具可以为你做到这一点,例如:
sed 's/$/t1/g'
Perl、Python或Ruby中可能有更优雅、更灵活的解决方案。根据您的需求,Bash解决方案如下所示。
- 文件内容被认为是用TAB分隔的(否则将
-d
更改为cut
) - 目前还不清楚如何在输出中派生第四列。因此,我忽略了它
- 不确定
sed 's/$/t1/g'
是否是您想要的。正如,您可能会得到具有相同第一个元素的行(例如,具有A
和D
的两行)。您的示例输出为每个键查找具有聚合值的唯一列
执行:
babil@host:~$ cat file1
A 0.01
B 0.09
D 0.05
F 0.08
babil@host:~$ cat file2
A 0.03
C 0.01
D 0.04
E 0.09
babil@host:~$ ./t.sh
A 0.01 0.03 1
B 0.09 NULL 1
C NULL 0.01 1
D 0.05 0.04 1
E NULL 0.09 1
F 0.08 NULL 1
babil@norbit:~$
代码:
#!/bin/bash
F1="file1"
F2="file2"
keys=$(cut -d $'t' -f1 $F1 $F2 | sort -u)
for k in $keys
do
v1=$(grep $k $F1 | cut -f2 -d $'t')
if [[ $v1 == "" ]]
then
v1="NULL"
fi
v2=$(grep $k $F2 | cut -f2 -d $'t')
if [[ $v2 == "" ]]
then
v2="NULL"
fi
echo -e "$kt$v1t$v2t1"
done