[英]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($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;
不清楚確切的格式,但這適用於您的示例,如果=和-在其他字段中,則可以使用。
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
我想出了這支班輪:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.