我有一个tab-delim文本文件,只有4列,如下所示:
GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:2:d:c:a:FAIL
如果在从column2到columnN开始的特定列中找到字符串“FAIL”(所有字符串用“:”分隔),则需要将该列中的第二个元素替换为“-1”。样本输出如下所示:
GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:-1:d:c:a:FAIL
使用awk的任何帮助?
答案 0 :(得分:2)
gawk:
awk '{$0=gensub(/[^:]*(:[^:]*:[^:]*:[^:]:FAIL)/,"-1\\1", "g" , $0)};1' File
sed 's/[^:]*\(:[^:]*:[^:]*:[^:]:FAIL\)/-1\1/g' File
答案 1 :(得分:2)
要以awk分割,您可以使用"split"
。
它的一个例子如下:
split(1,2,"3");
e.g
string="hello:world"
result=`echo $string | awk '{ split($1,ARR,":"); printf("%s ",ARR[1]);}'`
在这种情况下,结果将等于hello,
,因为我们将字符串拆分为“:”字符,如果打印出来,我们会打印ARR的前半部分ARR的后半部分(所以printf(“%s”,ARR [2]))然后它将被返回到“世界”。
答案 2 :(得分:2)
任何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
答案 3 :(得分:1)
如果您使用的是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 当前记录之后的记录分隔符。
答案 4 :(得分:0)
您的要求有点模糊,但我非常确定这可以通过bog标准awk(没有gnu-awk扩展名)实现您想要的功能:
awk '/FAIL/{$2=-1}1' ORS=\\t RS=\\t FS=: OFS=: input