输入:
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
谢谢。
答案 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