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

时间:2016-03-30 19:24:40

标签: bash awk sed seq

我遇到了bash的问题,我最近开始使用它。 我意识到很多神奇的东西只能用一行来完成,因为我之前的问题已经解决了。 这个问题很简单:

我有一个具有此格式的文件

PoliceOfficer(const ParkedCar &car, const ParkingMeter &meter, string name = "...", int badge_number = 000000)
    : car(car), meter(meter)
{
}

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

custom

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

2 个答案:

答案 0 :(得分:3)

您可以像这样使用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

<强>解释

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

答案 1 :(得分:0)

这可能适合你(GNU sed,seq和paste):

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

如果一行以数字开头,则使用行值作为seq命令的参数,然后将其传送到粘贴命令。使用e标志(GNU sed specific)评估substitute命令的RHS。