Используя 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|