$ 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"
答案 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
}
如果该行不以空格开头,我们设置var1
,var2
和var3
,如果它以我们设置的空格开始{ {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