比較文件基礎兩列並新增字段

比較文件基礎兩列並新增字段

我有“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 的第四列添加到文件 1 的第三列,最終得到以下結果:

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 函數並在結果中取得 file1 的 $4 和 $5?非常感謝任何幫助。

答案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

假設 GNUdatebash(或任何使用 進行處理替換的 shell <(...))並且資料儲存在檔案中,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
  • 這透過其選項傳遞給 GNUdate進行批次處理-f。作為輸出,我們使用格式請求日期%Y %j%Y是表格上的年份YYYY%j是表格上的日期DDD
  • cut使用單一空格作為分隔符號將其與原始檔案(由第二個產生)的最後兩列貼上。

這是從原始資料到最終結果的直接轉換,繞過了您建立的索引檔案的需要。

相關內容