Linuxで文字列を並べ替える

Linuxで文字列を並べ替える

コマンドラインを使用して行を変更するには?
たとえば、次の行があります。

    Acct-Status-Type = Start
    User-Name = "37XXXXXXX"
    Event-Timestamp = "Apr 12 2013 15:56:55 AMT"

順序を次のように変更する必要があります。

    Event-Timestamp = "Apr 12 2013 15:56:55 AMT"
    User-Name = "37XXXXXXX"
    Acct-Status-Type = Start

sed、awk、perl、または同様のコマンドでこれを行う必要があります。

ベストアンサー1

どこで、どのくらいの頻度、なぜするかなどによって異なりますが、スクリプトに入れても問題にはなりません。

とにかく、定義された順序で印刷するには、このような操作を実行できます。この方法では、選択した部分だけを印刷することもできます。たとえば、1と3万:

短い冗談:

awk -v order=312 \
'/^/{ln[NR]=$0}END{split(order,a,"");
 for(i in a)printf("%s\n",ln[a[i]]);}' \
 sample.txt

または読みやすくなります。

/^/{
    ln[NR] = $0
}
END{
    split(order,a,"");

    for(i in a)
        printf("%s\n",ln[a[i]]);
}

分割のために9行以上の場合は、区切り文字を追加できます。

たとえば、

split(order,a,"-");
# and call by:
awk -v order=3-13-21-12-2 ...

またはいくつかをサポートしてください:

if (order ~ /-/)       split(order, a, "-"); # order has "-", split
else if (order ~ /\./) split(order, a, "."); # order has ".", split
else if (order ~/:/)   split(order, a, ":"); # order has ":", split
else                   split(order, a, "");  # none presume numbers split all

次のように一致する行を選択することもできます。

BEGIN {
    i = 0;
}
/^\s*Acct-Status-Type/ {ln[++i] = $0 }
/^\s*User-Name/ {ln[++i] = $0 }
/^\s*Event-Timestamp/ {ln[++i] = $0 }
END {
    if (order ~ /-/)  split(order, a, "-");
    else if (order ~ /\./) split(order, a, ".");
    else if (order ~/:/) split(order, a, ":");
    else split(order, a, "")
    for (i in a)
        printf("%s\n", ln[a[i]]);
}

編集する:

最後の例では、これはより良いかもしれません。 (また更新されました分ける):

/^\s*Acct-Status-Type/ {ln[1] = $0 }
/^\s*User-Name/ {ln[2] = $0 }
/^\s*Event-Timestamp/ {ln[3] = $0 }
END {
    if (split(order, a, "-|:|,| |\\.") == 1) # Space require quoting of arg.
        split(order, a, "")
    for (i in a)
        printf("%s\n", ln[a[i]]);
}

おすすめ記事