如果某些行是字符串,如何对文件中的行进行排序
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。
我在使用 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。