2017-02-14 58 views
0

我在下面的格式文件1:在下面的格式用awk比較文件條目以及條件

14-02-2017 

one 01/02/2017 
two 31/01/2017 
three 14/02/2017 
four 01/02/2017 
five 03/02/2017 
six 01/01/2017 

和file2:

11-02-2017 

one 01/01/2017 
two 31/01/2017 
three 14/02/2017 
four 11/01/2017 

要求:我要複製,將文件2中提到的文件1從某個位置替換(或添加,如果需要的話)到文件2所在位置,其日期(以coulmn 2爲單位)大於文件2中提到的日期。可以保證在任何情況下文件2都不會一個程序的日期大於文件1的日期(但可以相等)。此外,文件2中丟失的文件條目(但存在於文件1中)也應該被複制。

所以,在這種情況下,文件一,四,五,六必從某個位置的文件2位置複製,腳本執行

的awk -F」'「NR == FNR後{C [$ 1] ++;}旁邊; C [$ 1]> 0' $ $ file2的文件1>共同

#文件1,列2 f1c2 =($(切-f2 -s $常見))

#文件2第2欄 f2c2 =($(cut -f2 -s $ file2))

for x in "${f1c2[@]}" 
do 
    for y in "${f2c2[@]}" 
    do 
     if [[ $x >= $y ]] 
     then 

    //copy file pointed by field $1 in "common" to file2 path 

      break 
     fi 
    done 
done 

我正在考慮一種有效地使用awk本身的方式來執行比較任務來創建「common」文件。因此,文件「common」將包含文件1中的最新文件以及文件2中缺少的項目。按照這種方式,我只需要複製文件「common」中提到的所有文件,不需要擔心。

I was was試圖添加一些if內部塊awk -F'''NR == FNR {c [$ 1] ++; next}; c [$ 1]> 0'$ file2 $ file1> common,但我無法弄清楚解決file1第2列和第2列第2列進行比較。

+0

awk是強制性的嗎? – mcoolive

+0

不是真的,但我想保持一個乾淨的外觀,沒有太多的代碼行 – user7083883

+1

我理解正確,file1中的日期是當前的文件日期,而file2中的日期代表舊的情況,並且你在上面是某種形式或鏡像或備份?如果是這樣,可能你需要的只是一個具有適當參數的'rsync'調用。讓我們知道... – Dario

回答

0

用awk同時解析2個文件很難。所以我建議另一種算法: - 合併文件 - 過濾器保留相關行

我可能會建議看一下「comm」和「join」命令。下面的例子

comm -23 <(sort file1) <(sort file2) 
+0

我已經使用awk腳本在上面顯示的「common」文件中有唯一的文件條目,但是我的問題是,我需要再次執行循環處理來比較文件「common's」列2與文件2的第2列進行日期比較 – user7083883

1

來獲得日期相比差異列表,你可以試試這個

awk 'NR==FNR {a[$1]=$2; next} 
    $1 in a {split($2,b,"/"); split(a[$1],c,"/"); 
       if(b[3]""b[2]""b[1] >= c[3]""c[2]""c[1]) delete a[$1]} 
    END  {for(k in a) print k,a[k]}' file1 file2 

six 01/01/2017 
four 01/02/2017 
five 03/02/2017 
one 01/02/2017 

和對結果的文件複製操作...

說明 鑑於文件1我們希望刪除日期字段小於文件2中的匹配條目的條目。

NR==FNR {a[$1]=$2; next}緩存文件的內容1

$1 in a(現掃描第二個文件),如果一個記錄在文件中存在1個

split($2,b,"/")...裂棗領域,使我們可以將順序更改爲年 - 月-date爲自然順序比較

if(b[3]...) delete a[$1]如果文件2日期大於或等於一個在文件1中,刪除該條目

END...打印剩餘的條目,這將滿足要求。

+0

哇!它工作的很好,但我不明白它的工作原理(awk是一種新的編程語言本身) – user7083883