如果使用sed或es匹配长度,如何移动列

时间:2019-07-09 01:03:08

标签: awk sed

我的日志文件如下:

1;127;20190529;094445;4261;7196
1;25;20190529;094636;1502;1536
1;1977;20190529;091419;7333;b001049109617002
1;1970;20190529;091426;b001049109617002;2138
1;1970;20190529;091426;b001049109617002;2139

我想检查每行的第5列是否有length > 4,然后将列的内容移至该行的末尾,并将第一列的内容从1更改为3。

我期望下面的输出:

1;127;20190529;094445;4261;7196
1;25;20190529;094636;1502;1536
1;1977;20190529;091419;7333;b001049109617002
3;1970;20190529;091426;2138;b001049109617002
3;1970;20190529;091426;2139;b001049109617002

2 个答案:

答案 0 :(得分:1)

一种奇怪的方式:

$ awk 'BEGIN{FS=OFS=";"} length($5) > 4 { $1 = 3; tmp = $5; $5 = $6; $6 = tmp } 1' inputfile
1;127;20190529;094445;4261;7196
1;25;20190529;094636;1502;1536
1;1977;20190529;091419;7333;b001049109617002
3;1970;20190529;091426;2138;b001049109617002
3;1970;20190529;091426;2139;b001049109617002

尽管我认为perl的数组切片为设置/交换字段提供了更优雅的解决方案:

$ perl -lF';' -e 'BEGIN{$,=";"} @F[0,4,5] = (3,@F[5,4]) if length $F[4] > 4; print @F' inputfile
1;127;20190529;094445;4261;7196
1;25;20190529;094636;1502;1536
1;1977;20190529;091419;7333;b001049109617002
3;1970;20190529;091426;2138;b001049109617002
3;1970;20190529;091426;2139;b001049109617002

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed -E 'h;s/[^;]+/\n&\n/5;/\n.{,4}\n/{g;b};s/;\n(.*)\n(.*)/\2;\1/;s/[^;]+/3/' file

复制原始行。隔离第5个字段并测试其长度。如果小于或等于4,请还原到原始行。否则,请使用模式匹配将字段移到记录的末尾并替换第一个字段的值。