ファイルには次の行が含まれています。
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
。