我有一个这样的大标签文件:
rs980 INPP5B missense I 749 NP_001284363.1
rs980 INPP5B reference L 749 NP_001284363.1
rs980 INPP5B missense F 749 NP_001284363.1
rs980 INPP5B missense I 913 NP_005531.2
rs980 INPP5B reference L 913 NP_005531.2
rs980 INPP5B missense P 913 NP_005531.2
rs1921 ISG15 reference S 83 NP_005092.1
rs1921 ISG15 missense N 83 NP_005092.1
rs1921 ISG15 missense T 83 NP_005092.1
rs2607 HEATR1 missense K 2133 NP_060542.4
rs2607 HEATR1 missense Q 2133 NP_060542.4
rs2607 HEATR1 reference E 2133 NP_060542.4
我想将所有行带有"参考"模式,然后在行之后移动一列,而没有参考模式,此外,在第一,第五和第六列中通常具有字符串。因此,输出应为:
rs980 INPP5B missense I 749 NP_001284363.1 L
rs980 INPP5B missense F 749 NP_001284363.1 L
rs980 INPP5B missense I 913 NP_005531.2 L
rs980 INPP5B missense P 913 NP_005531.2 L
rs1921 ISG15 missense N 83 NP_005092.1 S
rs1921 ISG15 missense T 83 NP_005092.1 S
rs2607 HEATR1 missense K 2133 NP_060542.4 E
rs2607 HEATR1 missense Q 2133 NP_060542.4 E
等等...我是通过一个带有尴尬的数组通过两个文件获得的,其中我将参考文献与其他文件分开,但有必要在bash中的同一文件中进行。是否有可能以这种简单的方式这样做?预先感谢。
是@inian。我执行两个文件,分开参考和其他文件。这样,我通过尴尬做以下命令
之类的命令awk 'BEGIN {FS=OFS="t"} NR==FNR {h[$2] = $1; next} {print $1,$2,$3,$4,$5,$6,h[$4] file_1 file_2 > output_file
在两个文件中,将列加入在一起的列,然后我通过awk创建一个数组,以将这些列与其他列与其他列相关联我想在输出文件中打印的引用。总而言之一个文件就像:
INPP5B missense I rs980;749;NP_001284363.1
INPP5B missense F rs980;913NP_005531.2
和参考:
INPP5B reference L rs980;749;NP_001284363.1
等等,我应用
awk 'BEGIN {FS=OFS="t"} NR==FNR {h[$4] = $3; next} {print $1,$2,$3,$4,h[$4]}' file_others file_reference > output_file
这是我如何获得它的简要摘要,但是我需要在同一原始文件@Inian中执行此操作。预先感谢
假设"文件"包含所有行,包括参考(您的"大签文件")
awk -F 't' -v OFS='t' '
{key = $1 FS $2 FS $5 FS $6}
NR == FNR {
if ($3 == "reference") val[key] = $4
next
}
$3 != "reference" {print $0, val[key]}
' file file
在这里,我们两次处理文件,一次收集引用,然后打印信息。
输出:
rs980 INPP5B missense I 749 NP_001284363.1 L
rs980 INPP5B missense F 749 NP_001284363.1 L
rs980 INPP5B missense I 913 NP_005531.2 L
rs980 INPP5B missense P 913 NP_005531.2 L
rs1921 ISG15 missense N 83 NP_005092.1 S
rs1921 ISG15 missense T 83 NP_005092.1 S
rs2607 HEATR1 missense K 2133 NP_060542.4 E
rs2607 HEATR1 missense Q 2133 NP_060542.4 E
一个选项是首先按第二列和第三列对文件进行排序,然后您只需要一次尴尬就需要进程。我不确定哪个会更快:
sort -k 2,2n -k 3,3n infile | awk 'BEGIN{OFS="t"} $3=="missense"{output[i++]=$0} $3=="reference"{for(line in output){print output[line],$4;delete output[line]}}'
输出:
rs1921 ISG15 missense N 83 NP_005092.1 S
rs1921 ISG15 missense T 83 NP_005092.1 S
rs2607 HEATR1 missense K 2133 NP_060542.4 E
rs2607 HEATR1 missense Q 2133 NP_060542.4 E
rs980 INPP5B missense F 749 NP_001284363.1 L
rs980 INPP5B missense I 749 NP_001284363.1 L
rs980 INPP5B missense I 913 NP_005531.2 L
rs980 INPP5B missense P 913 NP_005531.2 L
尴尬,处理文件两次:
$ awk '
BEGIN { FS=OFS="t" } # set separators
$3=="reference" { a[$6]=$4 } # get $4 from reference record (twice actually)
NR==FNR { next }
$3=="missense"{ print $0, a[$6] } # fetch $4 using $6 and print
' file file
rs980 INPP5B missense I 749 NP_001284363.1 L
rs980 INPP5B missense F 749 NP_001284363.1 L
rs980 INPP5B missense I 913 NP_005531.2 L
rs980 INPP5B missense P 913 NP_005531.2 L
rs1921 ISG15 missense N 83 NP_005092.1 S
rs1921 ISG15 missense T 83 NP_005092.1 S
rs2607 HEATR1 missense K 2133 NP_060542.4 E
rs2607 HEATR1 missense Q 2133 NP_060542.4 E
两个步骤过程
使用合成密钥和原始输入顺序创建一个排序的文件
awk -v d='_' '{print $1 d $2 d $5 d $6 , NR , $0}' | sort > temp_file
在钥匙上加入并过滤一些冗余字段
join temp_file temp_file -o1.2,1.3,1.4,1.5,1.6,1.7,1.8,2.5,2.6 |
sort -n | # sort back to original order
awk '$4=="missense" && $8=="reference"' | # filter required records
cut -d' ' -f1,8 --complement # get rid of seq no. and extra field