按所需顺序排列行

按所需顺序排列行

文件包含如下行:

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, -1to 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

相关内容