将文本文件与awk中的所有字段混合
我有两个选项卡分隔的文件,如以下小示例: 例1:将文本文件与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列
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中添加的?哦,你应该在接受新问题之前先考虑一下你现有问题的答案。在你问新问题之前,你应该考虑接受你现有问题的答案。看见