Parsing 使用awk解析

Parsing 使用awk解析,parsing,awk,Parsing,Awk,如何使用awk基于来自另一个文件的数据解析文件 我写了一个剧本: BEGIN{ FS="\t" ; OFS="\t" while((getline<"headfpkm")>0) { ++a id[a]=$1 fpkm[a]=$2 print id[a],fpkm[a] } lastid=id[a] print lastid close("headfpkm") } /$lastid/{

如何使用awk基于来自另一个文件的数据解析文件

我写了一个剧本:

BEGIN{ FS="\t" ; OFS="\t"

while((getline<"headfpkm")>0) {
        ++a
        id[a]=$1
        fpkm[a]=$2
        print id[a],fpkm[a]
        }
lastid=id[a]
print lastid
close("headfpkm")
}

/$lastid/{
        print $2,$3,$5,$7,$8,$14,fpkm[a]
        a--
        lastid=id[a]
}
END{ print "total lines=",FNR,"\n\nfile 1 index: ",a}
它正确运行BEGIN部分,但不提供任何输出

NM_000014       5.04503
NM_000015       0.586677
NM_000016       1.138332278
NM_000017       0.64386
NM_000018       3.61746
NM_000019       2.8793
NM_000020       10.846
NM_000021       0.685098
NM_000022       46388.6
NM_000026       0.257471
NM_000026
total lines=    10

file 1 index:   10
搜索部分有什么问题吗

文件2如下所示:

34      ACADM   NM_000016       9606    hsa-miR-3148    3       80      87      0.003   -0.016  -0.094  0.082   0.112   -0.160  97
34      ACADM   NM_000016       9606    hsa-miR-3163    1       623     629     0.001   -0.022  -0.020  0.065   0.125   -0.01   57
35      ACADS   NM_000017       9606    hsa-miR-3921    3       68      75      0.013   0.192   -0.097  0.031   -0.039  -0.147  82
35      ACADS   NM_000017       9606    hsa-miR-4303    2       67      73      0.012   0.150   -0.052  0.013   -0.039  -0.036  31
35      ACADS   NM_000017       9606    hsa-miR-4653-5p 3       68      75      0.003   0.192   -0.097  0.031   -0.039  -0.157  84
37      ACADVL  NM_000018       9606    hsa-miR-124     2       31      37      0.003   0.023   -0.057  0.012   -0.032  -0.171  76
37      ACADVL  NM_000018       9606    hsa-miR-1827    2       135     141     -0.007  -0.043  -0.058  0.039   -0.069  -0.258  91
37      ACADVL  NM_000018       9606    hsa-miR-2682    2       134     140     0.003   -0.014  -0.058  0.004   -0.047  -0.232  87
37      ACADVL  NM_000018       9606    hsa-miR-449c    2       134     140     -0.035  -0.014  -0.058  0.004   -0.047  -0.270  92
37      ACADVL  NM_000018       9606    hsa-miR-506     2       31      37      -0.016  0.023   -0.057  0.012   -0.032  -0.190  80
BEGIN {
    FS=OFS="\t"
}

FNR==NR {
    c++

    a[$1]=$2
    next
}

$3 in a {
    print $2,$3,$5,$7,$8,$14,a[$3]
}

END {
    printf "total lines=%s\n\nfile 1 index: %s\n", FNR, c
}

这将是一个猜测,因为我不是100%确定你想要完成什么。解决问题的更好方法是这样做:

34      ACADM   NM_000016       9606    hsa-miR-3148    3       80      87      0.003   -0.016  -0.094  0.082   0.112   -0.160  97
34      ACADM   NM_000016       9606    hsa-miR-3163    1       623     629     0.001   -0.022  -0.020  0.065   0.125   -0.01   57
35      ACADS   NM_000017       9606    hsa-miR-3921    3       68      75      0.013   0.192   -0.097  0.031   -0.039  -0.147  82
35      ACADS   NM_000017       9606    hsa-miR-4303    2       67      73      0.012   0.150   -0.052  0.013   -0.039  -0.036  31
35      ACADS   NM_000017       9606    hsa-miR-4653-5p 3       68      75      0.003   0.192   -0.097  0.031   -0.039  -0.157  84
37      ACADVL  NM_000018       9606    hsa-miR-124     2       31      37      0.003   0.023   -0.057  0.012   -0.032  -0.171  76
37      ACADVL  NM_000018       9606    hsa-miR-1827    2       135     141     -0.007  -0.043  -0.058  0.039   -0.069  -0.258  91
37      ACADVL  NM_000018       9606    hsa-miR-2682    2       134     140     0.003   -0.014  -0.058  0.004   -0.047  -0.232  87
37      ACADVL  NM_000018       9606    hsa-miR-449c    2       134     140     -0.035  -0.014  -0.058  0.004   -0.047  -0.270  92
37      ACADVL  NM_000018       9606    hsa-miR-506     2       31      37      -0.016  0.023   -0.057  0.012   -0.032  -0.190  80
BEGIN {
    FS=OFS="\t"
}

FNR==NR {
    c++

    a[$1]=$2
    next
}

$3 in a {
    print $2,$3,$5,$7,$8,$14,a[$3]
}

END {
    printf "total lines=%s\n\nfile 1 index: %s\n", FNR, c
}
运行方式如下:

awk -f script.awk headfpkm file2
结果:

ACADM   NM_000016  hsa-miR-3148     80   87   -0.160  1.138332278
ACADM   NM_000016  hsa-miR-3163     623  629  -0.01   1.138332278
ACADS   NM_000017  hsa-miR-3921     68   75   -0.147  0.64386
ACADS   NM_000017  hsa-miR-4303     67   73   -0.036  0.64386
ACADS   NM_000017  hsa-miR-4653-5p  68   75   -0.157  0.64386
ACADVL  NM_000018  hsa-miR-124      31   37   -0.171  3.61746
ACADVL  NM_000018  hsa-miR-1827     135  141  -0.258  3.61746
ACADVL  NM_000018  hsa-miR-2682     134  140  -0.232  3.61746
ACADVL  NM_000018  hsa-miR-449c     134  140  -0.270  3.61746
ACADVL  NM_000018  hsa-miR-506      31   37   -0.190  3.61746
total lines=10

file 1 index: 10

+1但是您能添加一些示例输入吗?在大多数情况下,应避免使用
getline()
。如果没有它,很可能会有一种更简单、更安全的方法来解决您的问题。我需要从文件中读取一列。在这个测试用例中,我只使用了前10行数据。文件很大。或者有没有一种方法可以使用sed打印文件并将每个流作为awk的输入?我知道
headfpkm
(以及您的
while
循环)正在生成您描述的输出。但是如果您可以包含
file2
的一些内容,这将非常有用。您使用的方法几乎肯定不是这样做的。
34 ACADM NM_000016 9606 hsa-miR-3148 3 80 87 0.003-0.016-0.094 0.082 0.112-0.160 97
文件2的每一行都是这样做的looks@bharat_iyengar:是的,例如,你可以写<代码>如果($3~/pattern/){…}。请看我上面的更新。这些是你想要的结果吗?是的,它成功了。谢谢。我想知道如果y中的x与
/$x/
的工作原理是否相同,如果文件1很大,我不想将其保存在数组中,那么是否可以同时运行两个流?例如,
sed''file1 | awk-f script file2
我认为不会,我也从未尝试过。如果
$x
是一个模式,那么它只是(例如)<代码>$0~$x。但通常需要测试一个变量是否等于另一个变量,例如:
$0==$x
。管道(
|
)符号用于将输出从一个命令传递到另一个命令。如果您希望加快处理大型文件的速度,我发现一个更好的方法是使用多核机器。有关示例,请参见。嗯。