首页 > 解决方案 > 使用awk或sed在bash中进行条件查找?

问题描述

我有这两个文件(都有标题),两个文件的每一行都以第一列的日期开头,格式相同。分隔符是一个分号。

在第一个文件的第 9 列,我只能有这些 id:UK 或 JPN 或 EUR。

我需要将 file1 与来自 file2 的 intel 与相应的日期 intel 聚合起来。

当然,我可以尝试使用 bash 脚本和“for”循环来完成,但我确信资源方面,使用 awk 或其他 bash 命令会更好……如果可能的话!

提前感谢您的任何提示。

ps:我尝试采用这种方法没有成功:https ://unix.stackexchange.com/questions/428861/vlookup-equivalent-in-awk-scripting

第一个文件:

Date;$2;$3;$4;$5;$6;$7;$8;Id
2018-01-01;              ;UK
2018-01-02;              ;JPN
2018-01-03;              ;EUR
2018-01-04;              ;JPN

第二个文件:

Date;UKDIR;JPNDIR;EURDIR

2018-01-01;1;2;3           
2018-01-02;4;5;6              
2018-01-03;7;8;9
2018-01-04;11;10;12

预期收益

Date;$2;$3;$4;$5;$6;$7;$8;Id  ;Intel
2018-01-01;              ;UK  ;1
2018-01-02;              ;JPN ;5
2018-01-03;              ;EUR ;9
2018-01-04;              ;JPN ;10

标签: bashawk

解决方案


你可以使用这个awk

awk -F';' -v OFS='; ' 'NR==1 { for (i=2; i<=NF; i++) h[i]=$i; next }
   FNR==NR { for (i=2; i<=NF; i++) a[$1,h[i]]=$i; next }
   FNR==1 { print $0, "Intel"; next }
   { print $0, a[$1,$NF "DIR"] }' file2 file1

Date;$2;$3;$4;$5;$6;$7;$8;Id; Intel
2018-01-01;              ;UK; 1
2018-01-02;              ;JPN; 5
2018-01-03;              ;EUR; 9
2018-01-04;              ;JPN; 10

推荐阅读