Awk 垂直Grep文本

Awk 垂直Grep文本,awk,grep,Awk,Grep,我有一个这样的文本文件 scaffold20 6146680 . T C 44.4146 . DP=2;VDB=0.02;SGB=-0.4 scaffold20 6146696 . G A 8.13869 . DP=1;SGB=-0.379885;MQ0 scaffold20 6146760 . A G 8.13869 . DP=1;SGB=-0.379885;MQ0 scaffold20 6146785 . A G 8.138

我有一个这样的文本文件

scaffold20  6146680 .   T   C   44.4146 .   DP=2;VDB=0.02;SGB=-0.4
scaffold20  6146696 .   G   A   8.13869 .   DP=1;SGB=-0.379885;MQ0
scaffold20  6146760 .   A   G   8.13869 .   DP=1;SGB=-0.379885;MQ0
scaffold20  6146785 .   A   G   8.13869 .   DP=1;SGB=-0.379885;MQ0
scaffold20  6146864 .   A   C   153 .   DP=7;VDB=0.637622;SGB
scaffold20  6146867 .   G   A   11.4845 .   DP=8;VDB=0.82;SGB=-0.45
scaffold20  6146914 .   G   A   20.2676 .   DP=5;VDB=0.06;SGB=-0.45
scaffold20  6147094 .   G   A   44.4146 .   DP=2;VDB=0.44;SGB=-0.45
scaffold20  6147165 .   C   T   8.13869 .   DP=1;SGB=-0.379885;MQ0F=
scaffold20  6147166 .   A   G   8.13869 .   DP=1;SGB=-0.37
我需要打印4列是否有此序列

  A
  A
  G
像这样

scaffold20  6146785 .   A   G   8.13869 .   DP=1;SGB=-0.379885;MQ0
scaffold20  6146864 .   A   C   153 .   DP=7;VDB=0.637622;SGB
scaffold20  6146867 .   G   A   11.4845 .   DP=8;VDB=0.82;SGB=-0.45

Grep中有任何选项吗?

在列中垂直Grep最好使用awk。这里有一个快速的方法

awk -v s="AAG" 'BEGIN{n=length(s);t=sprintf("%*s",n," ")}
                {b[FNR%n]=$0; t=substr(t,2)$4}
                (t==s) { for(i=1;i<=n;++i) print b[(FNR+i)%n] }' file
awk-vs=“AAG”开始{n=length(s);t=sprintf(“%*s”,n,”)
{b[FNR%n]=$0;t=substr(t,2)$4}
(t==s){for(i=1;i
  • 在一个数组中存储2行历史记录
  • 将第4列的历史记录存储在数组中
  • 如果当前行和历史记录中的两个第四列与您的条件匹配。
  • 打印历史记录
  • 打印当前行
  • 应:

    awk '
    n==2 && c[0]=="A" && c[1]=="A" && $4=="G"{
        for (i=0;i<n;++i) print(h[i])
        print
    }
    {
         # shift history left
         # its just h[0]=h[1]; c[0]=c[1]; anyway
         for (i=0;i<n-1;++i) { h[i]=h[i+1]; c[i]=c[i+1]; }
         if (n < 2) n++;
         # append to history
         h[n-1]=$0; c[n-1]=$4; 
    }' inputfile.txt
    
    awk'
    n==2&&c[0]==A&&c[1]==A&&4==G{
    对于(i=0;i通用解决方案:,可以在输入文件的第4列中提到需要匹配的序列,该列用空格分隔,然后它将进行检查

    awk -v sequence="A A G" '
    BEGIN{
      num=split(sequence,array," ")
      for(i=1;i<=num;i++){
      counter[i]=array[i]
      }
    }
    FNR==NR{
      a[FNR]=$4
      val[FNR]=$0
      next
    }
    ($4==counter[1]){
      found=1
      for(k=2;k<=num;k++){
        if(a[FNR+k-1]==counter[k]){ found++}
      }
    }
    found==num{
      print val[FNR]
      for(k=2;k<=num;k++){
         print val[FNR+k-1]
      }
      found=""
    }
    '  Input_file  Input_file
    

    假设一个制表符分隔的文件,并且模式成分只有一个字符长,您可以像这样使用
    grep
    coreutils
    sed

    col=4
    s=AAG
    from=$(( 1 + $(cut -f$col infile | tr -d '\n' | grep -bo $s | cut -d: -f1) ))
    to=$(( from + ${#s} - 1 ))
    sed -n "$from,$to p" infile
    
    输出:

    scaffold206146785.ag8.13869.DP=1;SGB=-0.379885;MQ0
    脚手架20 6146864.A C 153.DP=7;VDB=0.637622;SGB
    脚手架206146867.GA11.4845.DP=8;VDB=0.82;SGB=0.45
    
    如果文件匹配多次,您可以生成一个sed脚本,例如,在匹配之间使用分隔符(假设GNU sed):


    在Grep中有任何选项吗?
    没有。使用另一个工具并自己编程。比如在awk.或python.或perl.等中。我想知道为什么要这样做。在您的示例中,基因组位置(第2列)不是顺序的,所以你没有真正找到“AAG”基序,因为在A、A和G之间会有其他核苷酸。或者我遗漏了什么?这是为了检查特定位置上是否有任何变化示例开始或停止密码注意,此方法非常灵活,允许在人物专栏!
    awk '
    FNR==NR{
      a[FNR]=$4
      val[FNR]=$0
      next
    }
    ($4=="A" && a[FNR+1]=="A" && a[FNR+2]=="G"){
      print val[FNR] ORS val[FNR+1] ORS val[FNR+2]
    }
    ' Input_file   Input_file
    
    col=4
    s=AAG
    from=$(( 1 + $(cut -f$col infile | tr -d '\n' | grep -bo $s | cut -d: -f1) ))
    to=$(( from + ${#s} - 1 ))
    sed -n "$from,$to p" infile
    
    col=4
    s=AAG
    cut -f$col infile | tr -d '\n' | grep -bo $s | cut -d: -f1 | 
    while read n; do 
      from=$(( n+1 ))
      to=$(( from + ${#s} - 1 ))
      echo $from,$to p
      echo "$to z"
      echo "$to s/^/--/p"
    done | sed -nf - infile