AWK:在两种不同模式之间提取字符串

AWK: Extract string between two different patterns

我需要提取包含在我的 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=" 和“-”之间的字符串。我所做的是在 "cleavage=" 之后打印 2 个字符,但并不总是 2 个字符。

我是这样做的:

awk -F "\"*;\"*" '{if (match(,"cleavage=")) print ";"";"";"substr(,RSTART+9,2); else print ";"";"";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 , , , ( == "cleavage") ?  : 0, ""}' file
col1;col2;col3;10;
col1;col2;col3;1;
col1;col2;col3;100;
col1;col2;col3;0;

编辑: 如果 -= 可以出现在 </code> 之前的字段中,那么您可以使用:</p> <pre><code>awk -F ';' -v OFS=';' '{split(, a, /[=-]/); print , , , (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(匹配第三个参数)

awk '{match([=10=],/(.*);[^-0-9]*([0-9]*)[^;]*;$/,a);print a[1]";"+a[2]";"}' file

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

或 sed

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