根据字段值对齐文件

根据字段值对齐文件

我有一个如下所示的文件,其中有两个以 *.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$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

如果您要进行内联更改并使用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

相关内容