如何使用awk为起始和结束号码制作大小为100的箱子?

时间:2013-06-25 08:35:32

标签: shell awk

输入文件1

NM_75 X + 3000623
NM_47 X - 3000333
NM_60 X + 3000132
NM_70 X - 3000258

如何在第4个字段中为每个坐标获取-1500和+1500的起点和终点坐标,并使用awk制作大小为100的容器?

输出应为

start coordinate -1500+3000623= 2999123
end coordinate    3000623+1500= 3002123

现在从2999123-3002123的范围内,必须制作尺寸为100的箱子,即第3栏中的每个其他坐标同样为3000/100共30箱。

1 个答案:

答案 0 :(得分:1)

我不知道应该如何呈现这些“垃圾箱”,而是快速解决基本问题:

cat >infile <<XXX
NM_75 X + 3000623
NM_47 X - 3000333
NM_60 X + 3000132
NM_70 X - 3000258
XXX

awk '{print "start coordinate -1500+"$4"="$4-1500;
  for(i=-1400; i<1500; i+=100) print $1,$2,$3,$4+i
  print "end coordinate    "$4"+1500="$4+1500}' infile

输出:

start coordinate -1500+3000623=2999123
NM_75 X + 2999223
NM_75 X + 2999323
...
NM_75 X + 3001923
NM_75 X + 3002023
end coordinate    3000623+1500=3002123
start coordinate -1500+3000333=2998833
NM_47 X - 2998933
NM_47 X - 2999033
...
NM_47 X - 3001633
NM_47 X - 3001733
end coordinate    3000333+1500=3001833
start coordinate -1500+3000132=2998632
NM_60 X + 2998732
NM_60 X + 2998832
...
NM_60 X + 3001432
NM_60 X + 3001532
end coordinate    3000132+1500=3001632
start coordinate -1500+3000258=2998758
NM_70 X - 2998858
NM_70 X - 2998958
...
NM_70 X - 3001558
NM_70 X - 3001658
end coordinate    3000258+1500=3001758

相同
while read x y z n; do
  printf "start coordinate -1500+%7d=%7d\n" $n $((n-1500))
  for((i=-1400;i<1500;i+=100));{ printf "%s %s %s %d\n" $x $y $z $((n+i));}
  printf "end coordinate    %7d+1500=%7d\n" $n $((n+1500))
done <infile

对于大文件来说要快得多。

Qs的:

  • 第3个字段是第4个字段的标志吗?
  • 应该如何呈现“垃圾箱”?