我的日志文件如下:
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
答案 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,请还原到原始行。否则,请使用模式匹配将字段移到记录的末尾并替换第一个字段的值。