使用awk或类似的东西按特定列中的值的差异按行分析

时间:2018-02-23 15:45:20

标签: linux unix awk grep

我有一个包含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

2 个答案:

答案 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); }