*.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
内側$1
とalarms
交換など)のみを使用してください$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
インライン変更を行い、awk
4.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