首页 > 解决方案 > 使用公式合并两个文件

问题描述

我需要使用一些规则合并两个文件。第一个file1有 x 个用户,file2有 y 个用户;在文件 1 中,只有 1 美元 4 的用户可用。

它应该搜索文件的第 3 列,“IPxx”(IPxx 对每个用户都是唯一的,并且可以在 xx 中包含空格),并将其与文件 2 的第 5 列(没有 IP,xx 匹配 xx)进行比较。如果找到匹配项,则使用此公式将两者合并(F1 是 File1;F2 是 File 2):

$2 (F1): $1 (F1): $2 (F2): $1 (F2): $3 (F1): yyyy/mm/dd(今天的日期)

我这样做是为了找到 File1 上可用的人:

sed 's/\IP//' File1.txt | awk -F '(:)' '{if($4==1)print $2":"$1":"$3}'

并整理 File2

awk -F '(:)' '{print $2":"$1":"$3}'

现在我如何比较它们两者并使用该公式将它们合并在一起?

例子:

文件 1

123:bacon white:IPES:0
456:eggs grey:IPUS:1
789:ham yellow:IPUK:1

文件2

1:foo foo:ES:abc
2:bar bar:US:def
3:tmp tmp:ES:ghi
4:baz baz:UK:jkl
5:qux qux:US:mno
6:spam spam:UK:pqr
7:xyz xyz:UK:stu

输出文件

eggs grey:456:bar bar:2:IPUS:2021/03/10
eggs grey:456:qux qux:5:IPUS:2021/03/10
ham yellow:789:baz baz:4:IPUK:2021/03/10
ham yellow:789:spam spam:6:IPUK:2021/03/10
ham yellow:789:xyz xyz:7:IPUK:2021/03/10

标签: linuxbashsortingawksed

解决方案


$ awk -v date="$(date +"%Y/%m/%d")" '
            BEGIN   {FS=OFS=":"} 
            NR==FNR {f3=$3; sub(/^IP/,"",f3); a[f3]=$0; next} 
            $3 in a {split(a[$3],p); 
                     print p[2],p[1],$2,$1,p[3],date}' file1 file2

bacon white:123:foo foo:1:IPES:2021/03/09
eggs grey:456:bar bar:2:IPUS:2021/03/09
bacon white:123:tmp tmp:3:IPES:2021/03/09
ham yellow:789:baz baz:4:IPUK:2021/03/09
eggs grey:456:qux qux:5:IPUS:2021/03/09
ham yellow:789:spam spam:6:IPUK:2021/03/09
ham yellow:789:xyz xyz:7:IPUK:2021/03/09

ES 也匹配,不确定它们不在您的预期输出中。

NR==FNR在扫描第一个文件(

对于第二个文件,检查第三个字段是否在地图中,如果是,则拆分先前保存的记录并提取字段并按顺序打印。

将所需格式的日期作为变量传递给脚本并打印出来。

如果要根据第 4 个字段值排除记录,请在映射阶段添加过滤器

NR==FNR {if($4) {f3=$3 ... }}

推荐阅读