Используя sed или awk, как я могу изменить первое поле в строке с разделителями?

У меня есть файл с разделителями, первые несколько полей которого выглядят так:

2774013300|184500|2012-01-04 23:00:00|

и я хочу изменить некоторые строки, первое поле которых равно или превышает 8 символов. Я хочу усечь значение в первом столбце.

В случае 2774013300 Я хочу, чтобы его значение стало 27740133,

Я хотел бы сделать это в sedпредпочтительно или awk,

С помощью sedЯ могу найти любое число, которое превышает 8 цифр в начале строки, но я не совсем уверен, как его усечь, используя, я бы предположил, замену.

sed -n -e /'^[0-9]\{10,\}/p' infile

Я думаю, что мог бы использовать группировку для первых 8 символов и вернуть их в замещающей команде, но я не совсем уверен, как это сделать.

В awk я могу обнаружить первое поле, но я не совсем уверен, как использовать substr, чтобы изменить первое поле, а затем вернуть оставшиеся поля, чтобы сохранить полную строку.

awk -F'|'  '{ if (length($1) > 9) { print $1; print length($1);} }' infile

2 ответа

Решение

В зависимости от тонкостей вашей ситуации, вы можете использовать

sed 's/^\([0-9]\{8\}\)[0-9]*/\1/' infile

или же

sed 's/^\([0-9]\{8\}\)[0-9]\{1,\}/\1/' infile

который с помощью GNU sed может быть упрощен до

sed -r 's/^([0-9]{8})[0-9]+/\1/' infile

или, если вам нужно, добавить -n а также p,

Пример:

$ sed 's/^\([0-9]\{8\}\)[0-9]*/\1/' <<<'2774013300|184500|2012-01-04 23:00:00|'
27740133|184500|2012-01-04 23:00:00|

Использование awk:

awk -F'|' 'BEGIN{OFS=FS}length($1)>9{$1=substr($1, 0,9)}{print}'

пример:

$ echo "2774013300|184500|2012-01-04 23:00:00|" | awk -F'|' 'BEGIN{OFS=FS}length($1)>9{$1=substr($1, 0,9)}{print}'
27740133|184500|2012-01-04 23:00:00|
Другие вопросы по тегам