从列收集字符串和awd / sed打印数值范围以生成文本

时间:2013-11-29 18:21:43

标签: bash sed awk

$ cat /etc/release
                  Solaris 10 10/09 s10s_u8wos_08a SPARC

$ cat test.txt|grep BTTR3
TTM2-0        1 XM-0-0-2    15BTR4  BTTR3-480&&-487            5
                            2BTR4   BTTR3-64&&-75              6
                            31BTR4  BTTR3-992&&-1023           7
                            21BTR4  BTTR3-672&&-703            8
                            29BTR4  BTTR3-928&&-959            9
                            37BTR4  BTTR3-1184&&-1215         10
                            27BTR4  BTTR3-864&&-895           11
                            12BTR4  BTTR3-384&&-415           17
                            5BTR4   BTTR3-160&&-191           18
                            34BTR4  BTTR3-1088&&-1119         19
                            18BTR4  BTTR3-576&&-607           20
                            35BTR4  BTTR3-1120&&-1151         21
                            40BTR4  BTTR3-1280&&-1311         22
                            24BTR4  BTTR3-768&&-799           23

我需要列出并分隔我编辑的范围,以便与实际范围相比制作更小的范围(数百甚至数千个条目) cat | awk'{print $ 2,$ 3}然后在BTTR3(字符串)上sed将生成范围列表,如果TTM2-0不与第一行列一起。

我需要这样的东西:

$ cat expected.txt
TTM2-0  15BTR4  BTTR3-480
TTM2-0  15BTR4  BTTR3-481
TTM2-0  15BTR4  BTTR3-482
TTM2-0  15BTR4  BTTR3-483
TTM2-0  15BTR4  BTTR3-484
TTM2-0  15BTR4  BTTR3-485
TTM2-0  15BTR4  BTTR3-486
TTM2-0  15BTR4  BTTR3-487
TTM2-0  2BTR4   BTTR3-64
TTM2-0  2BTR4   BTTR3-65
TTM2-0  2BTR4   BTTR3-66
TTM2-0  2BTR4   BTTR3-67
TTM2-0  2BTR4   BTTR3-68
TTM2-0  2BTR4   BTTR3-69
TTM2-0  2BTR4   BTTR3-70
TTM2-0  2BTR4   BTTR3-71
TTM2-0  2BTR4   BTTR3-72
TTM2-0  2BTR4   BTTR3-73
TTM2-0  2BTR4   BTTR3-74
TTM2-0  2BTR4   BTTR3-75

等...

以后删除每个生成的数千范围的第一行:

$ cat filtered.txt
TTM2-0  15BTR4  BTTR3-481
TTM2-0  15BTR4  BTTR3-482
TTM2-0  15BTR4  BTTR3-483
TTM2-0  15BTR4  BTTR3-484
TTM2-0  15BTR4  BTTR3-485
TTM2-0  15BTR4  BTTR3-486
TTM2-0  15BTR4  BTTR3-487
TTM2-0  2BTR4   BTTR3-65
TTM2-0  2BTR4   BTTR3-66
TTM2-0  2BTR4   BTTR3-67
TTM2-0  2BTR4   BTTR3-68
TTM2-0  2BTR4   BTTR3-69
TTM2-0  2BTR4   BTTR3-70
TTM2-0  2BTR4   BTTR3-71
TTM2-0  2BTR4   BTTR3-72
TTM2-0  2BTR4   BTTR3-73
TTM2-0  2BTR4   BTTR3-74
TTM2-0  2BTR4   BTTR3-75

$ echo "any help is"; /usr/bin/banner "VERY" ; echo "appreciated"

2 个答案:

答案 0 :(得分:1)

如果我理解正确,以下脚本可以满足您的需求:

awk -f script.awk input.txt

使用script.awk:

!/^ /{
    var1=$1
    var2=$4
    var3=$5
}
/^ /{
    var2=$1
    var3=$2
}
{
    split(var3, arr, "[-&]")
    for (i=arr[2]+1; i<=arr[5]; i++)
        print var1, var2, arr[1]"-"i
}

如果该行以空格开头,我们设置var1var2var3,如果它以我们设置的空格开始{ {1}}和var2(自己更改变量名称,因为我不知道它们引用的是什么,我使用了var3的通用名称)。然后我们进一步拆分var1并执行循环。

答案 1 :(得分:1)

grep BTTR3 test.txt | 
nawk '
    function print_range(a, b, c,    d,i) {
        split(c, d, /&?&?-/)
        for (i = d[2]+1; i <= d[3]; i++) 
            printf "%s\t%s\t%s-%d\n", a,b,d[1],i
    } 
    NR==1 {a=$1; print_range(a, $4, $5); next} 
    {print_range(a, $1, $2)}
'

产生

TTM2-0  15BTR4  BTTR3-481
TTM2-0  15BTR4  BTTR3-482
TTM2-0  15BTR4  BTTR3-483
TTM2-0  15BTR4  BTTR3-484
TTM2-0  15BTR4  BTTR3-485
TTM2-0  15BTR4  BTTR3-486
TTM2-0  15BTR4  BTTR3-487
TTM2-0  2BTR4   BTTR3-65
TTM2-0  2BTR4   BTTR3-66
TTM2-0  2BTR4   BTTR3-67
TTM2-0  2BTR4   BTTR3-68
TTM2-0  2BTR4   BTTR3-69
TTM2-0  2BTR4   BTTR3-70
TTM2-0  2BTR4   BTTR3-71
TTM2-0  2BTR4   BTTR3-72
TTM2-0  2BTR4   BTTR3-73
TTM2-0  2BTR4   BTTR3-74
TTM2-0  2BTR4   BTTR3-75
TTM2-0  31BTR4  BTTR3-993
TTM2-0  31BTR4  BTTR3-994
TTM2-0  31BTR4  BTTR3-995
...
TTM2-0  24BTR4  BTTR3-797
TTM2-0  24BTR4  BTTR3-798
TTM2-0  24BTR4  BTTR3-799