awk根据条件打印字段:

时间:2018-02-11 15:59:59

标签: awk

我想将Input.csv文件的first field and third filed与Master.csv的Second and third fields进行比较。 如果fruits name matches和Master.csv的数量is less than输入量的数量,则打印两个文件中的所有行。

例如, 需要使用Input.csv检查Master.csv中的Fruits==Apple,Amount <20,因此输出将为

Fruits,Region,Amount,Details
Apple,North,10,Abc
Apple,south,9,Abc

Input.csv

水果,大区,金额,详细

Apple,North,10,Abc
Orange,East,115,Def
Apple,south,9,Abc
Apple,West,25,Abc
Orange,West,150,Def
Orange,North,200,Def
Mango,North,50,Ghi
Mango,East,75,Ghi

Master.csv

Details,Fruits,Amount
xxx,Apple,20
yyy,Mango,60
zzz,Cherry,80

Desired Output.csv

Fruits,Region,Amount,Details,Details,Fruits,Amount
Apple,North,10,Abc,xxx,Apple,20
Apple,south,9,Abc,xxx,Apple,20
Mango,North,50,Ghi,yyy,Mango,60

我试过下面的命令

awk -F "," 'FNR==NR {a[$1]; b[$3]; next} $2 in a && $3 < b' Input.csv Master.csv > Output.csv

1 个答案:

答案 0 :(得分:0)

关注awk可能对您有所帮助:

awk -F"," 'FNR==1 && FNR==NR{val=$0} FNR==NR{a[$2]=$3;b[$2]=$0;next} FNR==1 && FNR!=NR{for(i=NF;i>0;i--){val1=val1?$i OFS val1:$i};print val,val1} (($1 in a) && $3<a[$1]){print $0,b[$1]}'  OFS=, master.csv input.csv

现在添加非单线形式的解决方案:

awk -F"," '
FNR==1 && FNR==NR{
  val=$0
}
FNR==NR{
  a[$2]=$3;
  b[$2]=$0;
  next
}
FNR==1 && FNR!=NR{
  for(i=NF;i>0;i--){
    val1=val1?$i OFS val1:$i};
  print val,val1
}
(($1 in a) && $3<a[$1]){
  print $0,b[$1]
}
'  OFS=, master.csv input.csv

输出如下:

Details,Fruits,Amount,Fruits,Region,Amount,Details
Apple,North,10,Abc,xxx,Apple,20
Apple,south,9,Abc,xxx,Apple,20
Mango,North,50,Ghi,yyy,Mango,60