Как переместить столбцы, если они соответствуют длине, используя sed или - PullRequest
0 голосов
/ 09 июля 2019

У меня есть файл журнала ниже:

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 ]

1 голос
/ 09 июля 2019

Один путь awk:

$ 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
0 голосов
/ 09 июля 2019

Это может сработать для вас (GNU sed):

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

Сделайте копию оригинальной строки.Изолируйте 5-е поле и проверьте его длину.Если оно равно 4 или меньше, вернитесь к исходной строке.В противном случае используйте сопоставление с образцом, чтобы переместить поле в конец записи и заменить значение 1-го поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...