如果某些行是字符串,如何对文件中的行进行排序

How to sequence lines in files if some lines are strings

我在使用 bash 时遇到了问题,我最近才开始使用它。 我意识到只用一行就可以完成很多神奇的事情,因为我之前的问题已经被它解决了。 这次的问题很简单:

我有一个具有这种格式的文件

2 2 10
custom
8 10
3 5 18
custom
1 5

一些行等于字符串custom(可以是任意行!),其他行有2或3个数字。 我想要一个文件,它将用数字对行进行排序,但保留自定义的行(顺序也必须相同),因此所需的输出是

2 4 6 8 10
custom
8 9 10
3 8 13 18
custom
1 2 3 4 5

我也想用这个覆盖输入文件。 我知道使用 seq 我可以进行排序,但我希望以优雅的方式在文件中进行排序。

你可以这样使用 awk:

awk '/^([[:blank:]]*[[:digit:]]+){2,3}[[:blank:]]*$/ {
   j = (NF==3) ?  : 1
   s=""
   for(i=; i<=$NF; i+=j)
      s = sprintf("%s%s%s", s, (i==)?"":OFS, i)
   [=10=]=s
} 1' file

2 4 6 8 10
custom
8 9 10
3 8 13 18
custom
1 2 3 4 5

解释:

  • /^([[:blank:]]*[[:digit:]]+){2,3}[[:blank:]]*$/ - 仅匹配包含 2 个或 3 个数字的行。
  • j = (NF==3) ? : 1 - 如果有 3 列则将变量 j 设置为 </code> 否则将 <code>j 设置为 1
  • for(i=; i<=$NF; i+=j) 运行 从第一列到最后一列的循环,递增 j
  • sprintf用于格式化生成的序列
  • 1 是打印每一行的默认 awk 操作

这可能对您有用(GNU sed、seq 和粘贴):

sed '/^[0-9]/s/.*/seq & | paste -sd\  /e' file

如果一行以数字开头,则使用行值作为 seq 命令的参数,然后将其通过管道传输到粘贴命令。使用 e 标志(特定于 GNU sed)评估替代命令的 RHS。