获取特定列中的匹配字符串

时间:2018-11-14 05:48:16

标签: shell awk

输入:

FRUIT1|FRUIT2|COLORS
apple|orange|color1=red;color2=orange;color3=yellow
grapes|apple|color4=purple
pineapple|pomelo|color1=red;color3=orange
orange|apple|color1=red;color2=orange;color3=yellow;color4=purple

参考:

color1
color3
color4

我上面有一个输入文件和参考。 基本上,我想将3rd或COLORS列与引用下的字符串列表进行匹配,并在match之后和';'之前获取字符串。 输出将是前两列(FRUIT1和FRUIT2)以及匹配结果。

输出

apple|orange|red|yellow|
grapes|apple|||purple
pineapple|pomelo|red|orange|
orange|apple|red|yellow|purple

**不需要标题

我尝试遍历文件并通过grep匹配引用,但是我正在寻找通用的代码。

cat input.txt | while read line
do

color1=$(echo "$line" | grep -o -P '(?<=color1=).*?(?=;)')
color3=$(echo "$line" | grep -o -P '(?<=color3=).*?(?=;)')
color4=$(echo "$line" | grep -o -P '(?<=color4=).*?(?=;)')

echo $line| awk -F"|" -v color1=${color1} -v color3=${color3} -v color4=${color4} '{print $1"|"$2"|"color1"|"color3"|"color4}'

done

谢谢。

1 个答案:

答案 0 :(得分:0)

您的预期输出看起来不清晰,因此考虑到您需要打印|,以防万一在参考文件中找不到任何颜色值并且您的标题要求也不清楚。

awk '
BEGIN{
  FS=OFS="|"
}
FNR==NR{
  a[$0]
  next
}
FNR==1 && FNR!=NR{
  print
  next
}
{
  num=split($3,array,"[=;]")
  for(i=1;i<=num;i+=2){
    if(array[i] in a){
      val=val?val OFS array[i+1]:array[i+1]
    }
    else{
      val=val?val OFS "|":"|"
    }
  }
  print $1,$2,val
  val=""
}
' reference  Input_file

输出如下。

FRUIT1|FRUIT2|COLORS
apple|orange|red|||yellow
grapes|apple|purple
pineapple|pomelo|red|orange
orange|apple|red|||yellow|purple