将文本文件与awk中的所有字段混合

将文本文件与awk中的所有字段混合,awk,Awk,我有两个选项卡分隔的文件,如以下小示例: 例1: RBM3 1517 993 -0.611355 RBM4 142 142 0 PRKAG1 146 73 -1 MORF4L2 1766 715 -1.30447 例2: PCNP 370 139 -1.41244 RBM3 60 60 0 COTL1 338 252 -0.4236 PRKAG1 276 225 -0.294743 我想基于第1列(在两个文件中)获取公共行,并创建一个包含7列

我有两个选项卡分隔的文件,如以下小示例:

例1:

RBM3    1517    993 -0.611355
RBM4    142 142 0
PRKAG1  146 73  -1
MORF4L2 1766    715 -1.30447
例2:

PCNP    370 139 -1.41244
RBM3    60  60  0
COTL1   338 252 -0.4236
PRKAG1  276 225 -0.294743
我想基于第1列(在两个文件中)获取公共行,并创建一个包含7列的新文件,其中第1列是原始文件中的第1列,第2、3和4列来自第一个文件,第5、6和7列来自第2个文件(第2、3和4列)。以下是预期输出:

RBM3    1517    993 -0.611355   60  60  0
PRKAG1  146 73  -1  276 225 -0.294743
预期产出:

RBM3    1517    993 -0.611355   60  60  0
PRKAG1  146 73  -1  276 225 -0.294743
我正在使用以下代码在AWK中尝试这样做:

awk -v OFS="\t" 'NR==FNR {n[$2]=$1;next} ($2 in n) {print $1, $2, $3, $4, n[$2], n[$3], n[$4]}' file1 file2  > results.txt
但结果并不正确。你知道如何修复它吗?

这里有一种方法:

$ awk -v OFS="\t" '
NR==FNR {              # file2
    k=$1               # set key
    $1=""              # nullify $1, OFS stays
    a[k]=$0            # hash record on k
    next
}
($1 in a) {            # file1, if $1 matches in a
    print $0 a[$1]     # output record and a
}' file2 file1         # mind the order
RBM3    1517    993     -0.611355       60      60      0
PRKAG1  146     73      -1      276     225     -0.294743
使用您的方法类似于(未经测试):

这里有一个方法:

$ awk -v OFS="\t" '
NR==FNR {              # file2
    k=$1               # set key
    $1=""              # nullify $1, OFS stays
    a[k]=$0            # hash record on k
    next
}
($1 in a) {            # file1, if $1 matches in a
    print $0 a[$1]     # output record and a
}' file2 file1         # mind the order
RBM3    1517    993     -0.611355       60      60      0
PRKAG1  146     73      -1      276     225     -0.294743
使用您的方法类似于(未经测试):


在这方面,join再次优于awk:

$ join -j1 <(sort -k1 file1.txt) <(sort -k1 file2.txt) | sed 's/ /\t/g'      
PRKAG1  146 73  -1  276 225 -0.294743
RBM3    1517    993 -0.611355   60  60  0

$join-j1再一次,join在这方面比awk好:

$ join -j1 <(sort -k1 file1.txt) <(sort -k1 file2.txt) | sed 's/ /\t/g'      
PRKAG1  146 73  -1  276 225 -0.294743
RBM3    1517    993 -0.611355   60  60  0
$join-j1sort+awk

sort elly1.txt elly2.txt | awk ' {c=$1; if(c==p) {$1=""; print c,a,$0 } p=c;$1="";a=$0 } ' | sed 's/ +/\t/g'
在给定的输入下

$ cat elly1.txt
RBM3    1517    993 -0.611355
RBM4    142 142 0
PRKAG1  146 73  -1
MORF4L2 1766    715 -1.30447

$ cat elly2.txt
PCNP    370 139 -1.41244
RBM3    60  60  0
COTL1   338 252 -0.4236
PRKAG1  276 225 -0.294743

$ sort elly1.txt elly2.txt | awk ' {c=$1; if(c==p) {$1=""; print c,a,$0 } p=c;$1="";a=$0 } ' | sed 's/ +/\t/g'
PRKAG1  146 73 -1  276 225 -0.294743
RBM3  1517 993 -0.611355  60 60 0

$
排序+awk

sort elly1.txt elly2.txt | awk ' {c=$1; if(c==p) {$1=""; print c,a,$0 } p=c;$1="";a=$0 } ' | sed 's/ +/\t/g'
在给定的输入下

$ cat elly1.txt
RBM3    1517    993 -0.611355
RBM4    142 142 0
PRKAG1  146 73  -1
MORF4L2 1766    715 -1.30447

$ cat elly2.txt
PCNP    370 139 -1.41244
RBM3    60  60  0
COTL1   338 252 -0.4236
PRKAG1  276 225 -0.294743

$ sort elly1.txt elly2.txt | awk ' {c=$1; if(c==p) {$1=""; print c,a,$0 } p=c;$1="";a=$0 } ' | sed 's/ +/\t/g'
PRKAG1  146 73 -1  276 225 -0.294743
RBM3  1517 993 -0.611355  60 60 0

$

@JamesBrown-Huh。直到。可以断言这种重定向是POSIX语法,甚至ksh也支持它,POSIX shell就是基于这种语法的。可能是ksh93中添加的?好吧。
@JamesBrown,嗯。直到。可以断言这种重定向是POSIX语法,甚至ksh也支持它,POSIX shell就是基于这种语法的。可能是ksh93中添加的?哦,你应该在接受新问题之前先考虑一下你现有问题的答案。在你问新问题之前,你应该考虑接受你现有问题的答案。看见