是否可以在bash命令中的联接过程中添加常量列



我有两个输入文件

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'是否是您想要的。正如,您可能会得到具有相同第一个元素的行(例如,具有AD的两行)。您的示例输出为每个键查找具有聚合值的唯一列

执行:

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

最新更新