linux - 使用公式合并两个文件
问题描述
我需要使用一些规则合并两个文件。第一个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
解决方案
$ 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 ... }}
推荐阅读
- c# - TPL Dataflow CompletionPropagation 不工作 MaxMessage - 选项不工作
- excel - 如何根据合并单元格中的条件移动多行?
- javascript - Google Charts - 将默认内容与工具提示的自定义 HTML 混合
- python - 文本文件中的整数值不变
- reactjs - 当 onClick 提交时不点击按钮调试器,而是在表单的每个 onChange 中点击它
- tensorflow - 从 tensorflow api 检索所有托管模型
- r - DT中表页切换时如何存储回调事件改变的行样式?
- php - PHP 从 MySQLi 数据表中提取 URL
- angular - Angular 2 angular-ide 组件不包含在模块中,并且在模板中不可用
- ios - 带有 searchController 的 tableView 的奇怪滚动行为