我遇到了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我可以进行排序,但我希望以优雅的方式在文件中进行。
答案 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。