我有一个包含5列的制表符分隔符文件(file1)。如果第2列中的值差异大于1但小于11,我不想打印行。
这是file1:
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
这是我想要的输出(file2):
11 130068214 G A Test1
11 133790738 A C Test2
11 133790739 A C Test2
12 49418613 C T Test4
12 49434970 T G Test4
12 49435227 T G Test4
16 2817333 G T Test5
4 141622708 C T Test7
X 107374574 G A Test28
我尝试过以下代码,但这并没有给我所需的输出:
more file1 | awk '{if ($2!<prev) print $0; prev=$2}' > file2
答案 0 :(得分:0)
您显示的输出不符合您的要求。考虑到您需要先前第二列与当前第二列的差异,其差异范围应介于1到12之间,如果是这种情况,则以下内容可能对您有所帮助:
awk '((($2-prev)>1) && (($2-prev)<=11)) || FNR==1{print} {prev=$2}' Input_file
答案 1 :(得分:0)
将以下代码保存在文件中,例如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); }