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

Bash 如果某些行是字符串,如何对文件中的行排序,bash,awk,sed,seq,Bash,Awk,Sed,Seq,我遇到了bash的一个问题,我最近开始使用它。 我意识到很多神奇的东西都可以用一行来完成,因为我之前的问题就是用它来解决的。 这个时间问题很简单: 我有一个文件是这种格式的 2 2 10 custom 8 10 3 5 18 custom 1 5 有些行等于stringcustom(可以是任何行!),而其他行中有2或3个数字。 我想要一个文件,它将序列与数字行,但保持与自定义行(顺序也必须是相同的),所以所需的输出 2 4 6 8 10 custom 8 9 10 3 8 13 18 cust

我遇到了bash的一个问题,我最近开始使用它。 我意识到很多神奇的东西都可以用一行来完成,因为我之前的问题就是用它来解决的。 这个时间问题很简单:

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

2 2 10
custom
8 10
3 5 18
custom
1 5
有些行等于string
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) ? $2 : 1
   s=""
   for(i=$1; i<=$NF; i+=j)
      s = sprintf("%s%s%s", s, (i==$1)?"":OFS, i)
   $0=s
} 1' file

2 4 6 8 10
custom
8 9 10
3 8 13 18
custom
1 2 3 4 5
awk'/^([[:blank:][]*[:digit:][]+){2,3}[[:blank:][]*$/{
j=(NF==3)?$2:1
s=“”
对于(i=$1;i这可能适合您(GNU-sed、seq和paste):


如果一行以数字开头,则使用行值作为seq命令的参数,该命令随后通过管道传输到paste命令。使用
e
标志(GNU-sed-specific)评估替换命令的RHS.

自定义可以是任何一行,可能也可以是
1奇怪的一行
。问题不清楚,请投票选择直截了当的解决方案。它不起作用。也许我应该更清楚一点,任何一行都可以等同于自定义,它实际上就是字符串“custom”,其他行可以有2个或3个数字,并且可以是行中的任何数字,我测试该代码的文件是2 2 10;自定义;2 6 10;自定义;1 5(;表示行),请注意,对于2 6 10,输出应该是2 6-我确实希望在任何不等于custom的行上执行seq命令。如果有帮助,文件可以有1、2或3行。我没有提到这一点,因为我需要更一般的解决方案。由于文件中的最大行数是3,我可以通过大量if-else语句手动解决这个问题,这些语句将处理all 8个案例,但我希望得到更优雅的解决方案。像seq那样,2 3 4 5 6(如果步骤未指定,则等于1)很抱歉,它现在可以工作了。但是当我像上面那样输入复制粘贴代码时,它只打印文件1的内容,当我像在您的演示中一样在一行中输入时,它工作得非常好。您对此有解释吗?我对bash非常陌生。
sed '/^[0-9]/s/.*/seq & | paste -sd\\  /e' file