均衡块
equalizing block of nos
我有一个包含实验时间的文本文件
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
>
0.000
0.010
0.020
0.030
0.040
0.050
我想通过找出整个输入数据的最大值来均衡每个块,然后根据数据的增量(从输入自动计算)单个块应该均衡到输入数据中存在的最大值预期输出是
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
我尝试了下面给出的代码,但它通过重复下面给出的第二个块的最后一行给出结果,这与预期输出不同
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.030
0.030
>
0.000
0.010
0.020
0.030
0.040
0.050
我的脚本
awk '[=13=]==">" {
if (c && c>max)
max = c
++n
c = 0
next
}
{
r[n][++c] = [=13=]
}
END {
for (i=1; i<=n; ++i) {
print ">"
for (j=1; j<=(max>c?max:c); ++j){
print (r[i][j] == "" ? prev : r[i][j])
prev=r[i][j]==""?prev:r[i][j]
}
}
}' input
这段代码通过重复第二个块的最后一行值来给出输出,因为我正在做一些事情mistake.I希望专家可以帮助提前克服这个问题problem.Thanks。
如果这不是您所需要的:
$ cat tst.awk
NR==FNR {
if ( !/>/ && ((max == "") || ( > max)) ) {
max =
}
if ( (prev == prev+0) && ( == +0) ) {
step = - prev
}
prev =
next
}
/>/ {
if ( FNR > 1 ) {
prt()
}
}
{
print
prev =
}
END { prt() }
function prt( i) {
for ( i=prev+step; i<=max; i+=step ) {
printf "%.03f\n", i
}
}
$ awk -f tst.awk file file
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
然后编辑您的问题以阐明您的要求并提供更具代表性的样本input/output,包括上述情况不适用的情况。
Assumptions/Understandings:
- 所有块都以相同的值开始(例如,
0.000
)
- 所有值都递增相同的量(例如,
0.010
)
- 所有块都将展开以包含所有值
- net objective是将同一个块显示
N
次(其中N
是块数)
一个 awk
想法需要一次输入文件:
awk '
/^>/ { blkcnt++; next }
!( in seen) { seen[]; arr[++n]= }
END { for (i=1;i<=blkcnt;i++) {
print ">"
for (j=1;j<=n;j++)
print arr[j]
}
}
' input
这会生成:
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
注意:
- 我猜 OP 的真实输入文件还有更多内容(例如,每一行都包含时间值后面的附加文本数据),在这种情况下,此解决方案将无法满足
- 如果是这种情况,则 OP 应该使用更具代表性的样本数据集更新问题
我有一个包含实验时间的文本文件
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
>
0.000
0.010
0.020
0.030
0.040
0.050
我想通过找出整个输入数据的最大值来均衡每个块,然后根据数据的增量(从输入自动计算)单个块应该均衡到输入数据中存在的最大值预期输出是
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
我尝试了下面给出的代码,但它通过重复下面给出的第二个块的最后一行给出结果,这与预期输出不同
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.030
0.030
>
0.000
0.010
0.020
0.030
0.040
0.050
我的脚本
awk '[=13=]==">" {
if (c && c>max)
max = c
++n
c = 0
next
}
{
r[n][++c] = [=13=]
}
END {
for (i=1; i<=n; ++i) {
print ">"
for (j=1; j<=(max>c?max:c); ++j){
print (r[i][j] == "" ? prev : r[i][j])
prev=r[i][j]==""?prev:r[i][j]
}
}
}' input
这段代码通过重复第二个块的最后一行值来给出输出,因为我正在做一些事情mistake.I希望专家可以帮助提前克服这个问题problem.Thanks。
如果这不是您所需要的:
$ cat tst.awk
NR==FNR {
if ( !/>/ && ((max == "") || ( > max)) ) {
max =
}
if ( (prev == prev+0) && ( == +0) ) {
step = - prev
}
prev =
next
}
/>/ {
if ( FNR > 1 ) {
prt()
}
}
{
print
prev =
}
END { prt() }
function prt( i) {
for ( i=prev+step; i<=max; i+=step ) {
printf "%.03f\n", i
}
}
$ awk -f tst.awk file file
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
然后编辑您的问题以阐明您的要求并提供更具代表性的样本input/output,包括上述情况不适用的情况。
Assumptions/Understandings:
- 所有块都以相同的值开始(例如,
0.000
) - 所有值都递增相同的量(例如,
0.010
) - 所有块都将展开以包含所有值
- net objective是将同一个块显示
N
次(其中N
是块数)
一个 awk
想法需要一次输入文件:
awk '
/^>/ { blkcnt++; next }
!( in seen) { seen[]; arr[++n]= }
END { for (i=1;i<=blkcnt;i++) {
print ">"
for (j=1;j<=n;j++)
print arr[j]
}
}
' input
这会生成:
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
注意:
- 我猜 OP 的真实输入文件还有更多内容(例如,每一行都包含时间值后面的附加文本数据),在这种情况下,此解决方案将无法满足
- 如果是这种情况,则 OP 应该使用更具代表性的样本数据集更新问题