【问题标题】:Manipulate data in Awk在 awk 中处理数据
【发布时间】:2014-06-14 18:06:56
【问题描述】:

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

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

停止应由“from=name”确定,即“from=ABCB11”。必须捕获表达式并在下一次出现时替换的行不必像本例那样属于第 2 组.它可能是第 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

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

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 到第 10 组。这里只提到了来自较小组的对。

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

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

上面的代码能够提取出“from=name”中的替代行和“name”

【问题讨论】:

  • 请展示您的尝试,以便我们帮助您解决问题。
  • 组如何匹配?什么标准控制第一组第 2 组号码的停止位置和第二组第 2 组号码的开始位置?
  • 停止应由“from=name”确定,即“from=ABCB11”。必须捕获表达式并在下一次出现时替换的行不必属于组- 2.可能是group-3或group-4,直到group-10。所以第二组可能属于group-4/5/6,不一定是group-2。这里只是巧合。
  • 我建议您修改您的问题以减少“嘈杂”,在问题本身中包含Minimal, Complete, and Verifiable example 以及所有相关解释,而不是在评论中。
  • 我已经包含了所有相关的解释,但是由于我是 awk 编程的新手,而且它看起来不是简单的解析问题。我正在研究如何循环直到某个值并替换相关事件,但发现它很棘手。

标签: regex linux unix awk sed


【解决方案1】:

以下内容非常冗长(我喜欢冗长的变量名)。使用你的样本数据,我得到你想要的数据。这假设每个“不均匀”行都从具有相同“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 2021-06-23
    • 1970-01-01
    • 2018-10-31
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多