Unix 如何使用awk拆分和替换列中的字符串
我有一个tab delim文本文件,只有4列,如下所示:Unix 如何使用awk拆分和替换列中的字符串,unix,awk,Unix,Awk,我有一个tab delim文本文件,只有4列,如下所示: GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:2:d:c:a:FAIL GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:-1:d:c:a:FAIL 如果在从column2到columnN的特定列中发现字符串“FAIL”(所有字符串用“:”分隔),则需要将该列中的第二个元素替换为“-1
GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:2:d:c:a:FAIL
GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:-1:d:c:a:FAIL
如果在从column2到columnN的特定列中发现字符串“FAIL”(所有字符串用“:”分隔),则需要将该列中的第二个元素替换为“-1”。示例输出如下所示:
GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:2:d:c:a:FAIL
GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:-1:d:c:a:FAIL
使用awk?和gawk有任何帮助:
awk '{$0=gensub(/[^:]*(:[^:]*:[^:]*:[^:]:FAIL)/,"-1\\1", "g" , $0)};1' File
对于sed:
sed 's/[^:]*\(:[^:]*:[^:]*:[^:]:FAIL\)/-1\1/g' File
如果您使用的是GNU awk,则可以利用
RT
功能1,在制表符和换行符处拆分记录:
awk '$NF == "FAIL" { $2 = "-1"; } { printf "%s", $0 RT }' RS='[\t\n]' FS=':' infile
输出:
GT:CN:CNL:CNP:CNQ:FT.:2:a:b:c:PASS.:2:c:b:a:PASS.:-1:d:c:a:FAIL
1当前记录后面的记录分隔符。要在awk中拆分,可以使用
“拆分”
这方面的一个例子如下:
split(1,2,"3");
在这种情况下,结果将等于
hello,
,因为我们将字符串拆分为:“字符,并打印ARR的前半部分,如果我们打印ARR的后半部分(因此printf(“%s”,ARR[2]),那么它将返回“world”。您的要求有些模糊,但我很确定这符合bog标准awk(无gnu awk扩展)的要求:
对于任何awk:
$ awk 'BEGIN{FS=OFS="\t"} {for (i=2;i<=NF;i++) if ($i~/:FAIL$/) sub(/:[^:]+/,":-1",$i)} 1' file
GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:-1:d:c:a:FAIL
$awk'BEGIN{FS=OFS=“\t”}{for(i=2;iIs字符串总是在最后一个“:”列的分隔部分?它在文件末尾打印一个额外的选项卡,您可能希望在后期处理中对其进行修剪(只需将输出管道连接到sed'$d'
)。此外,我还有一些自由;如果第1列与'FAIL'匹配,那么这将修改前一行的最后一列,但我假设第1列始终是固定标题。