フィールド値に基づいてファイルを並べ替える

フィールド値に基づいてファイルを並べ替える

*.alarms.gzと*.values.gzで終わる2つのフィールドを持つ以下のファイルがあり、最初のフィールドのすべてのAlarms.gzと2番目のフィールドのすべての値などのファイルを並べ替えようとしています。どうすればいいですか?

入力サンプル

    20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
    20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
    20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
    20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
    20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
    20190412_92E9EA3400B1CF41.values.gz               20190412.alarms.gz
    20190412.alarms.gz              20190415_42E9EA3400B1CF41.values.gz
    20190412.alarms.gz              20190415_32E9EA3400B1CF41.values.gz
    20190412.alarms.gz              20190412_12E1EA3400B1CFA1.values.gz

希望の出力

20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190412_92E9EA3400B1CF41.values.gz               
20190412.alarms.gz              20190415_42E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190415_32E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190412_12E1EA3400B1CFA1.values.gz

答え1

awkグリッドの外側にある一致する行(列値のvalues内側$1alarms交換など)のみを使用してください$2{..}1行内で行われた変更やフィールド/レコード区切り文字への変更など、行{..}全体を再編成します。

awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp }1' file | 
column -t

この部分はcolumn -tただきれいに印刷するための部分ですawk。適切な幅を使用できますが、printf()前のコマンドを使用すると操作が簡単になります。

ただし、POSIXの苦情にのみawk使用してください。printf()

awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp; } 
{ printf "%s%40s\n",$1,$2}' file

インライン変更を行い、awk4.1.2より低いGNUを使用する場合は、一時ファイルを使用してコンテンツを

tmpfile=$(mktemp)

awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp }1' file | 
column -t > "$tmpfile" && mv "$tmpfile" file

spongeまたは、moreutilsパッケージのマジックツールを使用してください(RHELでは、次の操作を行いますyum install moreutils)。

awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp }1' file | 
column -t | 
sponge file

関連情報