Linux 使用awk或类似的方法,通过特定列中值的差异逐行解析
我有一个5列的制表符分隔符文件(file1)。如果第2列中的值差大于1但小于11,我不想打印行 以下是文件1:Linux 使用awk或类似的方法,通过特定列中值的差异逐行解析,linux,unix,awk,grep,Linux,Unix,Awk,Grep,我有一个5列的制表符分隔符文件(file1)。如果第2列中的值差大于1但小于11,我不想打印行 以下是文件1: 11 130068214 G A Test1 11 133790738 A C Test2 11 133790739 A C Test2 12 25398281 C T Test3 12 25398284 C T Test3 12 49418613 C T Test4 12 49424177
11 130068214 G A Test1
11 133790738 A C Test2
11 133790739 A C Test2
12 25398281 C T Test3
12 25398284 C T Test3
12 49418613 C T Test4
12 49424177 T G Test4
12 49424185 A C Test4
12 49434970 T G Test4
12 49435227 T G Test4
16 2817333 G T Test5
16 3781407 T G Test6
16 3781413 T G Test6
16 3781416 A C Test6
16 3781419 A C Test6
4 141622708 C T Test7
X 107374574 G A Test28
这是我想要的输出(文件2):
我尝试了以下代码,但没有得到所需的输出:
more file1 | awk '{if ($2!<prev) print $0; prev=$2}' > file2
more file1 | awk'{if($2!您显示的输出不符合您的要求。考虑到您需要前第二列与当前第二列的差异,其差异范围应在1到12之间,如果是这种情况,则以下内容可能会帮助您:
awk '((($2-prev)>1) && (($2-prev)<=11)) || FNR==1{print} {prev=$2}' Input_file
awk'(($2-prev)>1)和($2-prev)将以下代码保存在文件中,比如在filter.awk
中,并像awk-f filter.awk data.tsv
一样运行
FNR==1 { prev = $0; prev_num =$2; prev_ok=1 }
FNR>1 {
d = ($2-prev_num)**2; ok = !(d<121 && d>1);
#workaround for ignoring sign
if (prev_ok && ok) print(prev);
prev_num=$2; prev =$0; prev_ok = ok;
}
END { if (prev_ok) print (prev); }
FNR==1{prev=$0;prev_num=$2;prev_ok=1}
FNR>1{
d=(上一个数字为$2)**2;ok=!(d1);
#忽略符号的解决方法
如果(prev_ok&&ok)打印(prev);
prev_num=$2;prev=$0;prev_ok=ok;
}
结束{if(prev_ok)print(prev);}
欢迎使用Stack Overflow,请在帖子中为您显示的示例输入文件和预期输出使用代码标记。
FNR==1 { prev = $0; prev_num =$2; prev_ok=1 }
FNR>1 {
d = ($2-prev_num)**2; ok = !(d<121 && d>1);
#workaround for ignoring sign
if (prev_ok && ok) print(prev);
prev_num=$2; prev =$0; prev_ok = ok;
}
END { if (prev_ok) print (prev); }