如何使用awk拆分和替换列中的字符串

时间:2016-05-13 12:31:50

标签: 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

如果在从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的任何帮助?

5 个答案:

答案 0 :(得分:2)

gawk:

awk '{$0=gensub(/[^:]*(:[^:]*:[^:]*:[^:]:FAIL)/,"-1\\1", "g" , $0)};1' File
使用sed:

sed 's/[^:]*\(:[^:]*:[^:]*:[^:]:FAIL\)/-1\1/g' File

答案 1 :(得分:2)

要以awk分割,您可以使用"split"

它的一个例子如下:

split(1,2,"3");
  1. 1是您要拆分的字符串
  2. 2是您要将其拆分为
  3. 的数组
  4. 和3是您要分割的字符
  5. 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