有条件地将换行符插入到数字序列中(最好使用bash,awk或sed)

时间:2015-04-10 20:47:43

标签: bash awk sed sh

我试图在每次后续数字小于前一个数字(例如“72.774”和“7.009”之间的中断)时,在具有这种结构的文本文件中为文本文件添加换行符:

7.007 28.929 50.851 72.774 7.009 28.932 50.854 72.777 7.015 32.939 54.862 76.784      

我希望输出采用以下格式:

7.007 28.929 50.851 72.774  
7.009 28.932 50.854 72.777  
7.015 32.939 54.862 76.784  

文件并不总是具有相同数量的数字条目(总计或在系列开始重新计数之前),也不是所有文本文件中都需要相同数量的换行符。

我一直试图在awk或sed中使用条件,但没有运气。

提前感谢您提出任何建议/解决方案。

注意:已编辑以反映第一条评论。

3 个答案:

答案 0 :(得分:4)

这可能是你想要的:

$ awk -v RS=' ' '{printf "%s%s", (NR>1?($0<p?ORS:OFS):""), $0; p=$0}' file
7.007 28.929 50.851 72.774
7.009 28.932 50.854 72.777
7.015 32.939 54.862 76.784

答案 1 :(得分:0)

以下是使用awk的一个解决方案:

{
  for (i=1; i<=NF; ++i) {
    if ($i < last) {
        printf "\n"
        last=-1
    } else if (last > 0) {
        printf " "
    }
    printf "%s", $i
    last = $i
  }
}
END { printf "\n" }

示例运行:

$ awk -f foo.awk bar.txt
7.007 28.929 50.851 72.774 94.696 116.619 138.542 160.464 182.387 204.309 226.232 248.155 270.077 292 313.922 335.845 357.768 379.69 401.613 423.535 445.458 467.381
7.009 28.932 50.854 72.777 94.699 116.622 138.545 160.467 182.39 204.312 226.235 248.158 270.08 292.003 313.925 335.848 357.771 379.693 401.616 423.538 445.461 467.384 489.306
7.015 32.939 54.862 76.784 102.708 124.631 146.553 168.476 190.398 212.321 234.244 260.167 282.09 308.013 333.937 355.86 377.782 403.706
7.005 28.928 50.85 72.773 94.696 116.618 138.541 160.463 186.387 212.311 234.233 256.156 278.079 300.001 321.924 347.847

答案 2 :(得分:0)

另一个AWK解决方案:

awk 'BEGIN { RS=" "; ORS=" "; prev=-999 } 
     { if ( $1<prev ) { printf "\n%.3f", $1 } 
       else { printf "%.3f ", $1 } prev=$1 
     } 
     END { print }'