目的の順序で行を並べ替える

目的の順序で行を並べ替える

ファイルには次の行が含まれています。

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

いつでもDecor-sort-un装飾方法を使用して-2t-1に割り当てることができます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

関連情報