在Awk中处理数据

时间:2014-04-29 01:17:33

标签: regex linux unix awk sed

我是Awk编程的新手。我有一个关于操作文本文件的问题,这是在可视化软件(Circos http://circos.ca)中绘制某些基于网络的图像所必需的

我有输入数据,我想使用awk / grep / sed操作值。 有9对(18行).5对(前10行)用于"来自= ABCB11"和4对(接下来的8行)用于"来自= ABCC8"。我想要的是从第一对的第一行中提取值,并将其替换为其他对的其余每一行。 所以group-2的值是9 10,它应该替换group2中所有值的出现。 组-2的下一个值是28 29,应该用9 10替换。

停止应由" from = name"这是"来自= ABCB11"。没有必要在下一次出现时必须从中捕获表达式并替换它们的行将属于第2组,如本例所示。它可以是第3组或第3组-4直到第10组。所以第二组("来自= ABCC8")可能属于第4/5/6组,而不是必要组-2。这只是巧合。

group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 28 29 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-5 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-2 29 30 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-5 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-2 10 11 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-3 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-2 11 12 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-3 2 3 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 12 13 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-1 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-2 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-1 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-2 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1
group-1 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1

以下是FINAL输出,我正在寻找:

group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-5 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-5 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-3 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-3 2 3 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 12 13 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-1 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-1 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1
group-1 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1

此外,这只是一个样本数据。所以很多对都有group-1,group-4,group-5 upto group 10.这里只提到来自较小组的对。

我想遍历这些行,直到" from = name"中的值为止。保持不变,这样我就可以改变每个备用行中的所有出现。代码:

awk -F, 'NR%2==1 {split($2,a,"="); print a[2]}' file.txt

上面的代码能够提取备用行和" name" in" from = name"

1 个答案:

答案 0 :(得分:0)

以下内容非常详细(我喜欢详细的变量名称)。使用您的样本数据,我可以获得您想要的数据。这假设每一个"不均匀" line从第一行获取相同的" from = xxxx"信息。

awk '
  BEGIN {
    namevar=""
    val1var=""
    val2var=""
    linenum=0
  }
  {
    split($0, linearr)
    split(linearr[5], csvarr, ",")
    if (namevar != csvarr[2]) {
      namevar=csvarr[2]
      val1var=linearr[2]
      val2var=linearr[3]
      linenum=0
    }
    linenum+=1
    if (linenum%2==1) {
      print linearr[1], val1var, val2var, linearr[4], linearr[5]
    } else {
      print linearr[1], linearr[2], linearr[3], linearr[4], linearr[5]
    }
  }' file.txt