是否可以在join in bash命令期间添加常量列?

是否可以在join in bash命令期间添加常量列?,bash,join,Bash,Join,我有两个输入文件 文件1 文件2 我想要的输出是 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 这给了我 jo

我有两个输入文件

文件1

文件2

我想要的输出是

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解决方案

  • 文件内容被视为由制表符分隔(否则将
    -d
    更改为
    cut
  • 目前还不清楚您如何导出输出中的第四列。因此,我忽略了它
  • 不确定
    sed的/$/\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 "$k\t$v1\t$v2\t1"
done
代码:

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 "$k\t$v1\t$v2\t1"
done