Regex AWK:提取两个不同模式之间的字符串

Regex AWK:提取两个不同模式之间的字符串,regex,bash,awk,delimiter,Regex,Bash,Awk,Delimiter,我需要提取csv列中包含的字符串 我的文件如下: col1;col2;col3;cleavage=10-11; col1;col2;col3;cleavage=1-2; col1;col2;col3;cleavage=100-101; col1;col2;col3;none; 因此,我的文件的分隔符是“;”,但在第4列中,我想提取“cleavage=”和“-”之间的字符串。我所做的是在“clovage=”之后打印2个字符,但并不总是2个字符 我是这样做的: awk -F "\"*;\"*" '

我需要提取csv列中包含的字符串

我的文件如下:

col1;col2;col3;cleavage=10-11;
col1;col2;col3;cleavage=1-2;
col1;col2;col3;cleavage=100-101;
col1;col2;col3;none;
因此,我的文件的分隔符是“;”,但在第4列中,我想提取“cleavage=”和“-”之间的字符串。我所做的是在“clovage=”之后打印2个字符,但并不总是2个字符

我是这样做的:

awk -F "\"*;\"*" '{if (match($4,"cleavage=")) print $1";"$2";"$3";"substr($4,RSTART+9,2); else print $1";"$2";"$3";0"}' file
我发现下面的命令应该是正确的,但是如何将它集成到前面的命令中呢

awk "/Pattern1/,/Pattern2/ { print }" inputFile
谢谢你的帮助!:)

编辑: 我的实际产出是

col1;col2;col3;10;
col1;col2;col3;1-;
col1;col2;col3;10;
col1;col2;col3;0;
但我想说的是:

col1;col2;col3;10;
col1;col2;col3;1;
col1;col2;col3;100;
col1;col2;col3;0;

您可以将此awk与多个分隔符一起用作字段分隔符:

awk -F '[;=-]' -v OFS=';' '{print $1, $2, $3, ($4 == "cleavage") ? $5 : 0, ""}' file
col1;col2;col3;10;
col1;col2;col3;1;
col1;col2;col3;100;
col1;col2;col3;0;
编辑:如果
-
=
可以出现在
$4
之前的字段中,则可以使用:

awk -F ';' -v OFS=';' '{split($4, a, /[=-]/);
           print $1, $2, $3, (a[1] == "cleavage") ? a[2] : 0, ""}' file
col1;col2;col3;10;
col1;col2;col3;1;
col1;col2;col3;100;
col1;col2;col3;0;

我提出了一条建议:

 awk -F';' -v OFS=";" '{sub(/cleavage=/,"",$(NF-1));
                        sub(/-.*/,"",$(NF-1));$(NF-1)+=0}7' file
它给

col1;col2;col3;10;
col1;col2;col3;1;
col1;col2;col3;100;
col1;col2;col3;0;

不清楚确切的格式,但这适用于您的示例,如果=和-在其他字段中,则可以使用

GNU awk(用于第三个参数的匹配)

或sed

sed 's/;[^-0-9]*\([0-9]\{1,\}\)[^;]*;$/;\1;/;t;s/[^;]*;$/0;/' file

您期望的输出是什么?字段分隔符中的转义引号是什么?这很聪明,但如果列
1-3
中存在
-or=
,它将失败。否则这是一个很好的答案。好的观点@Kent,我在我的答案中添加了另一个替代方案。太好了!我试过大多数,但我认为这是最好的答案。这很容易,我也很容易融入到我的指挥中(这要长得多)。其他的都是很好的答案,但对于我来说,我认为这是最好的答案。
sed 's/;[^-0-9]*\([0-9]\{1,\}\)[^;]*;$/;\1;/;t;s/[^;]*;$/0;/' file