文件包含如下行:
acb/xyz/row<t>
acb/xyz/row<t>
abc/xyz/row<1>
abc/xyz/row<1>
abc/xyz/row<0>
abc/xyz/row<0>
abc/xyz/row<3>
abc/xyz/row<3>
abc/xyz/row<2>
abc/xyz/row<2>
abc/xyz/row<4>
abc/xyz/row<4>
abc/xyz/row<b>
abc/xyz/row<b>
所以我希望输出是
acb/xyz/row<t>
acb/xyz/row<t>
abc/xyz/row<b>
abc/xyz/row<b>
abc/xyz/row<0>
abc/xyz/row<0>
abc/xyz/row<1>
abc/xyz/row<1>
abc/xyz/row<2>
abc/xyz/row<2>
abc/xyz/row<3>
abc/xyz/row<3>
abc/xyz/row<4>
abc/xyz/row<4>
t(代表顶部)和 b(代表底部)在数字之前并按该顺序排序。
答案1
您始终可以使用装饰-排序-取消装饰方法,将 -2 分配给t
, -1
to b
:
<your-file awk -F'[<>]' '
{print $2 == "t" ? -2 : $2 == "b" ? -1 : $2, $0}' |
sort -n |
cut -d' ' -f2-
答案2
可能还有其他方法,但我认为执行此操作的最佳方法涉及使用多个命令,您可以使用一个小脚本来完成此操作。
这里的脚本首先获取所有带有 的行<t>
,然后获取所有带有 的行<b>
,然后获取所有包含数字的行<#>
并按数字对它们进行排序:
如果您可以省略| sort
前两个命令中的仅有的里面的内容是什么<...>
:
#!/usr/bin/env bash
# get all rows with <t>
grep '<t>' input.txt | sort > output.txt
# get all rows with <b>, append to result
grep '<b>' input.txt | sort >> output.txt
# find lines with numbers inside <#>, pull the
# number out to start, sort numerically, then remove
# numbers pulled out to start; append to result
sed -n 's/.*<\([0-9]\+\)>.*/\1 &/p' input.txt | \
sort -n | sed 's/^[0-9]\+ //' >> output.txt
我假设输入文件是input.txt
,输出是output.txt
;根据需要进行更改。
使脚本可执行chmod a+x script.sh
并运行它./script.sh
。