如何编写脚本文件来处理这种文件?

时间:2019-12-29 12:11:19

标签: shell

我有一个像这样的文件:

“ JE_TUT_M05_W1_009 [2 1 1 1 1 1 1 1] [18774 18773 18773] [1610 1609] [14604 14603 14603] [2598 2597 2597 2597 2597 2597] [2 1 1 1 1 1 1 1] JE_TUT_M05_W1_009 SIL K_B R_I AE1_I SH_E SIL“

每个符号,例如SIL,K_B,R_I,AE1_I,SH_E都对应一个[]。现在,我想计算每个[]中的数字。例如,对于第一个SIL,数字的数量是1-8,对于K_B,数字的数量是9-11,依此类推。总的来说,最终结果有点像一个数组:SIL-> 1-8,K_B-> 9-11,R_I-> 12-13,AE1_I-> 14-16 ....... 我想知道如何编写脚本来获得结果。

2 个答案:

答案 0 :(得分:1)

使用一些适合数据处理的语言,例如GNU awk。

因为今天是我的生日,看来您不知道如何解决这个问题,所以这里是一个开始:

$ gawk '
BEGIN {
    FPAT = "([^ ]+)|(\\[[^][]+\\])"
}
{
    gsub(/^"|"$/,"")
    for(i=2;i<=NF/2;i++) {
        gsub(/^\[|\]$/,"",$i)
        print $(i+(NF/2)) "->" c+1 "-" (c+=split($i,tmp,FS))
    }
}' file

输出:

SIL->1-8
K_B->9-11
R_I->12-13
AE1_I->14-16
SH_E->17-22
SIL->23-30

答案 1 :(得分:0)

def parse_line(input_line):
    my_list = input_line.split(' ')
    my_skip = my_list[0]
    count = 0
    j = -1
    out_dict = {}
    for elem in my_list:
        if elem.isdigit():
            count = count + 1
        if my_skip == elem:
            continue
        if elem == '[':
            start = count + 1
        if elem == ']':
            print( my_list[j] ,"->", f"{start}-{count}" )
            j = j - 1 

input_line = "JE_TUT_M05_W1_009 [ 2 1 1 1 1 1 1 1 ] [ 18774 18773 18773 ] [ 1610 1609 ] [ 14604 14603 14603 ] [ 2598 2597 2597 2597 2597 2597 ] [ 2 1 1 1 1 1 1 1 ] JE_TUT_M05_W1_009 SIL K_B R_I AE1_I SH_E SIL"
parse_line(input_line)

以上是python解决方案。我假设JE_TUT_M05_W1_009即第一个字符串在您的输入行中出现了两次。

  

输出:

SIL -> 1-8
SH_E -> 9-11
AE1_I -> 12-13
R_I -> 14-16
K_B -> 17-22
SIL -> 23-30