2017-02-14 89 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