Bash合并两行数据的命令
Bash command to merge two rows data
我有一个三列数据文件,我想使用 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
...
假设您的数据始终正确:
cat data.txt | sort | while read a b c && read d e f; do echo $a $c $f; done
更新:添加了排序,因为 whithop 和 noop 行可以按任何顺序排列。
如果您可以依赖成对出现的相关行,这里有一个 single-pass awk
解决方案:
awk '{
op1=; val1=
getline
val2=
print " " (op1 == "withop" ? val1 " " val2 : val2 " " val1)
}' file
op1=; val1=
将操作字段(</code>,第二个whitespace-separated字段)读入var。 <code>op1
,并将值字段(</code>,第三个字段)转化为var。 <code>val1
.
getline
从输入文件中读取下一行,这导致 它的 字段反映在 </code>, .. .</p>
<ul>
<li><sup>虽然在这种特殊情况下使用 <code>getline
很好 - 这些线可以假定为 成对 - 它有很多陷阱,它的使用很少是正确的选择 - 请参阅 http://awk.info/?tip/getline
val2=
然后将第二行的值字段存储在 var 中。 val2
.
print " " (op1 == "withop" ? val1 " " val2 : val2 " " val1)
然后为手头的两行打印一个输出行:
</code>,第一个字段,根据定义在两行上是相同的,所以我们可以使用第二行的值。</li>
<li><code>(op1 == "withop" ? val1 " " val2 : val2 " " val1)
是一个 C-style 三元运算符(内联条件),它只是在第二行之前打印第一行的值,反之亦然,具体取决于第一行的操作字段是否为 withop
与否。
我有一个三列数据文件,我想使用 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
...
假设您的数据始终正确:
cat data.txt | sort | while read a b c && read d e f; do echo $a $c $f; done
更新:添加了排序,因为 whithop 和 noop 行可以按任何顺序排列。
如果您可以依赖成对出现的相关行,这里有一个 single-pass awk
解决方案:
awk '{
op1=; val1=
getline
val2=
print " " (op1 == "withop" ? val1 " " val2 : val2 " " val1)
}' file
op1=; val1=
将操作字段(</code>,第二个whitespace-separated字段)读入var。 <code>op1
,并将值字段(</code>,第三个字段)转化为var。 <code>val1
.getline
从输入文件中读取下一行,这导致 它的 字段反映在</code>, .. .</p> <ul> <li><sup>虽然在这种特殊情况下使用 <code>getline
很好 - 这些线可以假定为 成对 - 它有很多陷阱,它的使用很少是正确的选择 - 请参阅 http://awk.info/?tip/getline
val2=
然后将第二行的值字段存储在 var 中。 val2
.
print " " (op1 == "withop" ? val1 " " val2 : val2 " " val1)
然后为手头的两行打印一个输出行:
</code>,第一个字段,根据定义在两行上是相同的,所以我们可以使用第二行的值。</li> <li><code>(op1 == "withop" ? val1 " " val2 : val2 " " val1)
是一个 C-style 三元运算符(内联条件),它只是在第二行之前打印第一行的值,反之亦然,具体取决于第一行的操作字段是否为withop
与否。