【问题标题】:Conditional insert of line breaks to number sequence (preferably using bash, awk, or sed)有条件地将换行符插入数字序列(最好使用 bash、awk 或 sed)
【发布时间】:2015-06-16 16:52:35
【问题描述】:

每次后续数字小于具有此结构的文本文件中的前一个数字(例如,“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 中使用条件,但没有任何运气。

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

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

【问题讨论】:

  • 你能想出一个例子,例如,少于 10 个字段来证明你的问题,这样我们就不必费力地遍历所有这些字段来寻找你的关键值吗?跨度>
  • 欢迎来到 SO:SE。请发布您的最佳尝试(代码,结果......)。见How to Ask

标签: bash awk sed sh


【解决方案1】:

这是使用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

【讨论】:

  • 我采取了和你一样的方法,没有占位符变量:awk '{printf "%s", $1; for (i=2; i&lt;=NF; i++) printf "%s%s", ($(i-1)&gt;$i?"\n":" "), $i; print ""}'
【解决方案2】:

这可能是你想要的:

$ 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

【讨论】:

  • 嗯,这肯定比我的解决方案要短。 :)
  • 这正是我想要做的。谢谢。
【解决方案3】:

另一种 AWK 解决方案:

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

【讨论】:

    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 2019-08-07
    • 2015-12-29
    • 2019-12-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多