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