我有一个如下所示的文件,其中有两个以 *.alarms.gz 和 *.values.gz 结尾的字段,想要对齐文件,例如第一个字段中的所有alarms.gz 和第二个字段中的所有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_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