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

时间:2015-10-20 13:32:21

标签: 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;

所以,我文件的分隔符是&#34 ;;"但在第4列中,我想在" cleavage ="之间提取字符串。和" - "。我所做的是在" cleavage ="之后打印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;

3 个答案:

答案 0 :(得分:1)

您可以将此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;

答案 1 :(得分:1)

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

GNU awk(第3场比赛)

awk '{match($0,/(.*);[^-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,\}\)[^;]*;$/;\1;/;t;s/[^;]*;$/0;/' file

答案 2 :(得分: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;