Regex AWK:提取两个不同模式之间的字符串
我需要提取csv列中包含的字符串 我的文件如下: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 "\"*;\"*" '
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