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
我需要提取包含在我的 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