【问题标题】:Bash command to merge two rows dataBash命令合并两行数据
【发布时间】:2016-01-17 15:29:30
【问题描述】:

我有一个三列数据文件,我想对数据进行一些转换,以便使用 bash 进行绘图。请注意,它并不总是首先是withop。有时,noop 行可能是第一个 样本数据为:

printff withop     1
printff noop     0
partial_sums withop     1
partial_sums noop     1
fasta noop     1
fasta withop     1
word_anagrams withop     2
word_anagrams noop     2
list noop     0
list withop     8
gc_mb withop     1
gc_mb noop     1
simple_connect withop     0
simple_connect noop     0
binary_trees noop     2
binary_trees withop     2
cal noop     3
cal withop     6

我想要的转换是将每两行与第一列的相同值合并。新的格式还是三列,第二列是withop,第三列是noop。例如,新数据为:

printff  1   0
partial_sums   1 1
....
list    8   0
...

【问题讨论】:

    标签: bash shell parsing text multiple-columns


    【解决方案1】:

    如果您可以依赖成对出现的相关行,这里有一个单遍awk 解决方案:

    awk '{
      op1=$2; val1=$3
      getline
      val2=$3
      print $1 " " (op1 == "withop" ? val1 " " val2 : val2 " " val1)
    }' file
    
    • op1=$2; val1=$3 将操作字段($2,第二个空格分隔字段)读入 var。 op1,并将值字段($3,第三个字段)放入 var。 val1
    • getline 从输入文件中读取下一行,这会导致 its 字段反映在 $1 中,...

      • 虽然在这种特殊情况下使用 getline 很好 - 可以假设线条是配对的 - 它有很多陷阱,而且它的使用很少是正确的选择 - 请参阅 @ 987654321@
    • val2=$3 然后将第二行的值字段存储在 var 中。 val2

    • print $1 " " (op1 == "withop" ? val1 " " val2 : val2 " " val1) 然后为手头的两行打印一个输出行:
      • $1,第一个字段,根据定义在两行中是相同的,所以我们可以使用第二行的值。
      • (op1 == "withop" ? val1 " " val2 : val2 " " val1) 是 C 风格的三元运算符(内联条件),它只是在第二行之前打印第一行的值,反之亦然,具体取决于第一行的操作字段是否为 withop

    【讨论】:

      【解决方案2】:

      假设您的数据始终正确:

      cat data.txt | sort | while read a b c && read d e f; do echo $a $c $f; done
      

      更新:添加了排序,因为 whithop 和 noop 行可以是任何顺序。

      【讨论】:

      • 记录有顺序。有时是withop,然后是op,而另一些则相反。
      • 简单而有效,但是,与任何涉及bash 循环的解决方案一样,对于较大的文件,性能可能会成为问题。
      • @mklement0:好吧,如果我有一个包含数百万行的文件,我不会使用 bash :)
      • @nsilent22:这是一个很好的观点,但我认为可以公平地假设当人们标记问题bash 他们通常在寻找一个纯 Bash 解决方案;相反,它们通常意味着:一种涉及可以从 Bash 调用的标准 Unix CLI 的解决方案。 @shijiexu,请随时澄清。
      猜你喜欢
      • 1970-01-01
      • 2019-06-22
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多