Как преобразовать «гггг-мм-дд» в «дд.мм» в столбце текстового файла с помощью awk (или sed и т. Д.)?

373
N0rbert

Давайте рассмотрим, что у нас есть следующая строка в текстовом файле:

... 2018-09-13 5555 33-33 Some_string ... 

Мне нужно изменить первый столбец (дата как yyyy-mm-dd) на другой формат (без dd.mmучета года), не затрагивая другие столбцы:

... 13.09 5555 33-33 Some_string ... 

Как я могу сделать это программно с помощью awk(или sedи т. Д.)?

0

1 ответ на вопрос

2
Kamil Maciorowski

Возможное решение

sed 's/^....-\(..\)-\(..\)/\2.\1/' 

Эти несколько точек не могут быть элегантными; команда не заботится, имеет ли она дело с числами; ему все равно, есть ли что-то еще в первой «колонке». Эти проблемы могут быть исправлены с помощью более сложного подхода, но в его нынешнем виде команда довольно проста.

Общая команда sed 's/A/B/'заменяет шаблон Aс B, не более одного раза в каждой строке.

Где Aв этом случае состоит из:

  • ^ - начало маркера строки,
  • .... - ровно четыре символа,
  • -- буквально -,
  • (..)- ровно два символа, на которые ссылаются позже \1,
  • -- буквально -,
  • (..)- ровно два символа, на которые ссылаются позже \2.

И Bэто

  • \2- все, что было во втором ()в A,
  • .- буквально .,
  • \1- что бы ни было в первом ()в A.

Дополнительно (и )избежали \.

Для обработки файла добавьте его в качестве последнего аргумента. Для обработки файла на месте используйте -i, например,

sed -i 's/^....-\(..\)-\(..\)/\2.\1/' myfile.txt