Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何使用awk拆分和替换列中的字符串_Unix_Awk - Fatal编程技术网

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

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

我有一个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
使用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");
  • 1是要拆分的字符串
  • 2是要将其拆分为的数组
  • 3是你想要分割的角色
  • e、 g


    在这种情况下,结果将等于
    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列始终是固定标题。