сравнить файлы по двум столбцам и добавить поле

сравнить файлы по двум столбцам и добавить поле

У меня есть файлы с датами и временем по столбцам в формате "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), используя один пробел в качестве разделителя.

Это прямое преобразование исходных данных в конечный результат, минуя необходимость в созданном вами индексном файле.

Связанный контент