用awk或sed在bash中进行条件vlookup?

时间:2018-09-18 14:22:31

标签: bash awk

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

在第一个文件的第9列上,我只能具有以下ID:UK或JPN或EUR。

我需要将file2与文件2中的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

3 个答案:

答案 0 :(得分:1)

您可以使用此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

function getValueOfOrder(order){
  var cards = document.getElementsByClassName("square");
  for(i=0;i<cards.length;i++){
    if(cards[i].style.order==order){
      return(cards[i].dataset.value );
    }
  }
}

答案 1 :(得分:1)

请您尝试以下。

awk '
BEGIN{
  count=count1=1
  FS=OFS=";"
}
FNR!=NR && FNR==1{
  print $0 OFS "Intel"
}
FNR==NR && /^[0-9]/{
  a[$1]=$(++count)
  count=count==4?1:count
  next
}
NF && /^[0-9]/{
  print $0 OFS a[$1]
  count1=count1==4?1:count1
}
' second_file  first_file

输出如下。

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;11

答案 2 :(得分:1)

n = 100;
DV = [-2 -1 0 1 2];
p = [.1 .2 .3 .3 .1]; % probability of each value. Sum 1, same size as DV
M = 10;
SDUD = sum(bsxfun(@times, DV, mnrnd(n, p, M)), 2);