Команда AWK уменьшит ГГГГММДД на 4 года - PullRequest
0 голосов
/ 22 апреля 2020

Я CSV-файл с 2 столбцами, то есть DATE и TYPE. Если Тип - B, ДАТА должна уменьшиться на 4 года, то есть в ГГГГММДД ГГГГ должно быть -4. Например, если дата 20200422, дата должна стать 20160422 для данных B в поле TYPE.

Спасибо!

DATE, TYPE,

20200101, A

20200422, B

20200401, B

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Только что выучил флаг e (для «выполнить») через несколько дней go. Похоже, отлично работает для этой проблемы. Обратите внимание, что это расширение GNU - этот трюк может не работать, возможно, на MacOS (которая основана на FreeBSD).

Вот входной файл, который я создал для тестирования:

$ cat myfile.csv
DATE,TYPE
20200310,B
20180228,B
20181215,A
20130404,A
20050228,B

А вот решение sed и вывод:

$ cat myfile.csv | sed -E 's/^([[:digit:]]{8}),B$/echo $((\1 - 40000)),B/e'
DATE,TYPE
20160310,B
20140228,B
20181215,A
20130404,A
20010228,B

Конечно, «дата» не будет действительной датой, если вы начнете, например, с 19040229 и вычтете 4 из года ; 1904 год был високосным, а 1900 - нет. К счастью, 2000 год делится на 400, поэтому это был високосный год; с 1905 по 2103 годы у вас все будет хорошо.

Более безопасный вариант - заменить echo $((\1 - 40000)),B на

date -d "& -4 years" +%Y%m%d,B
0 голосов
/ 22 апреля 2020

Поскольку в Awk строку, которая выглядит как число, можно рассматривать как единое целое, решение может быть простым, например, путем вычитания 40000.

$ awk 'BEGIN { print 20200422 - 40000 }'
20160422

$ awk 'BEGIN { print "20200422" - 40000 }'
20160422
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...