如何将包含图案中包含一个图案的行并将其移至行中,而不是unix中几乎没有列

  • 本文关键字:unix 几乎没有 包含一 包含图 bash unix awk
  • 更新时间 :
  • 英文 :


我有一个这样的大标签文件:

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

相关内容

最新更新