У меня есть файлы с датами и временем по столбцам в формате "YYYY MM DD HHMM" плюс переменная (температура), и я хочу преобразовать их в формат YYYY DDD (и сохранить час и температуру как есть). Они выглядят так, но одна и та же дата встречается в файле несколько раз:
1980 01 01 0100 3.3
1982 04 11 0400 2.2
1985 12 04 0700 1.7
1995 12 31 1000 2.2
Я создал индексный файл (1980-2017) с количеством дней, которые нужно добавить к каждой дате первого файла, чтобы получить кумулятивный день года DDD (последний столбец). Первый год выглядит так (1980 год был високосным):
1980 01 31 000
1980 02 29 031
1980 03 31 060
1980 04 30 090
1980 05 31 121
1980 06 30 152
1980 07 31 182
1980 08 31 213
1980 09 30 244
1980 10 31 274
1980 11 30 305
1980 12 31 335
Я пытаюсь сравнить два файла по первым двум столбцам и, если они совпадают, добавить четвертый столбец файла file2 к третьему столбцу файла file1 и получить что-то вроде этого:
1980 001 0100 3.3
1982 101 0400 2.2
1985 346 0700 1.7
1995 365 1000 2.2
Мне удалось сравнить два столбца файлов и добавить два столбца с помощью awk ниже:
awk -F' ' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' junktemp matrix_sample | awk '{print $1, $3+$4}'
но так я теряю $4 и $5 (час и температура). Есть ли способ объединить две функции awk и получить $4 и $5 из file1 в результате? Любая помощь будет очень признательна.
решение1
Это трудно проверить, поскольку вы указали потенциальные совпадения только за один год, но
awk 'NR==FNR{c[$1$2]=$4; next} ($1$2 in c) {$3 = sprintf("%03d", $3 + c[$1$2])} {print $1, $3, $4, $5}' file2 file1
1980 001 0100 3.3
1982 11 0400 2.2
1985 04 0700 1.7
1995 31 1000 2.2
решение2
Предположим, что GNU date
и bash
(или любая оболочка, которая обрабатывает замену с помощью <(...)
) и что данные хранятся в файле, file
как в первом примере данных в вопросе:
$ paste -d ' ' <( date -f <( cut -d ' ' -f1-3 file | tr ' ' '-' ) +"%Y %j" ) \
<( cut -d ' ' -f4-5 file )
1980 001 0100 3.3
1982 101 0400 2.2
1985 338 0700 1.7
1995 365 1000 2.2
- Первый
cut
используется вместе сtr
для преобразования дат в первых трех столбцах входных данных в формуYYYY-MM-DD
. - Это передается в GNU
date
для пакетной обработки через его-f
опцию. В качестве выходных данных мы запрашиваем даты, используя формат%Y %j
.%Y
— это год в формеYYYY
, а%j
— это день года в формеDDD
. - Он вставляется вместе с двумя последними столбцами из исходного файла (созданного вторым
cut
), используя один пробел в качестве разделителя.
Это прямое преобразование исходных данных в конечный результат, минуя необходимость в созданном вами индексном файле.