我有一个以下格式的文件:
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进行比较。
答案 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中匹配条目的条目。
如果文件1中存在记录,则
NR==FNR {a[$1]=$2; next}
缓存文件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)