使用awk比较文件条目以及条件

时间:2017-02-14 16:35:16

标签: bash 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

要求:我想复制,替换(或在必要时添加)从某个位置提到file1的文件到file2所在的位置,其日期(以库存2表示)大于文件2中提到的日期。它是保证在任何情况下文件2的程序日期都不会大于文件1的日期(但可以相等)。此外,文件2中缺少的文件条目(但存在于文件1中)也应复制。

因此,在这种情况下,脚本执行后,文件1,4,5和6应从某个位置复制到file2位置

awk -F'''NR == FNR {c [$ 1] ++; next}; c [$ 1]> 0'$ file2 $ file1>通用

#File 1,第2栏  f1c2 =($(cut -f2 -s $ common))

#File 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”中提到的所有文件而不用担心

我试图在awk -F中添加一些if块'''NR == FNR {c [$ 1] ++; next}; c [$ 1]> 0'$ file2 $ file1>常见,但我无法弄清楚如何处理file1 column2和file 2 column2进行比较。

2 个答案:

答案 0 :(得分: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中存在记录,则

$1 in a(现在扫描第二个文件)

     

split($2,b,"/")...拆分日期字段,以便我们可以将订单更改为自然订单比较的年 - 月 - 日期

     

if(b[3]...) delete a[$1]如果文件2的日期大于或等于文件1中的日期,则删除条目

     

END...打印剩余的条目,这将满足要求。

答案 1 :(得分:0)

使用awk同时解析2个文件很难。所以我建议另一种算法: - 合并文件 - 过滤以保持相关行

我可能会建议您查看&#34; comm&#34;和&#34;加入&#34;命令。这是一个例子

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