有条件地将换行符插入数字序列(最好使用 bash、awk 或 sed)
Conditional insert of line breaks to number sequence (preferably using bash, awk, or sed)
每次在具有此结构的文本文件中,后续数字小于前一个数字(例如“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 中使用条件,但一直没有成功。
提前感谢您的任何 suggestions/solutions。
注意:已编辑以反映第一条评论。
这是使用 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 -v RS=' ' '{printf "%s%s", (NR>1?([=10=]<p?ORS:OFS):""), [=10=]; p=[=10=]}' 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
另一种 AWK 解决方案:
awk 'BEGIN { RS=" "; ORS=" "; prev=-999 }
{ if ( <prev ) { printf "\n%.3f", }
else { printf "%.3f ", } prev=
}
END { print }'
每次在具有此结构的文本文件中,后续数字小于前一个数字(例如“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 中使用条件,但一直没有成功。
提前感谢您的任何 suggestions/solutions。
注意:已编辑以反映第一条评论。
这是使用 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 -v RS=' ' '{printf "%s%s", (NR>1?([=10=]<p?ORS:OFS):""), [=10=]; p=[=10=]}' 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
另一种 AWK 解决方案:
awk 'BEGIN { RS=" "; ORS=" "; prev=-999 }
{ if ( <prev ) { printf "\n%.3f", }
else { printf "%.3f ", } prev=
}
END { print }'