比较所有线路中不在同一列中的两个字段



我的问题如下所示:比较连续线中不在同一列中的两个字段

但是,不同的是,我想为所有行,而不仅仅是连续的行都这样做。

感谢您的任何帮助!

编辑:例如 ,我想标记$ 2 == $ 4(在另一行)和$ 3 == $ 5(在另一行中)的行起始文件是:

c3 1 63072 1 63072
c3 18109 29942 13125 25007
c3 18105 26056 14949 22881
c3 19004 26038 18102 25145
c3 14949 22881 18105 26056
c3 18102 25145 19004 26038
c3 18090 26038 13562 21528
c3 18964 26028 18532 25565
c3 14162 21991 10076 17931
c3 18964 26038 9921 17008

和我希望的结果:

c3 1 63072 1 63072 Not_Equal
c3 18109 29942 13125 25007 Not_Equal
c3 18105 26056 14949 22881 Not_Equal
c3 19004 26038 18102 25145 Not_Equal
c3 14949 22881 18105 26056 Equal
c3 18102 25145 19004 26038 Equal
c3 18090 26038 13562 21528 Not_Equal
c3 18964 26028 18532 25565 Not_Equal

因为第五行与第3行一样,第6行与第4行相同。(我希望对的部分进行此比较,其中第一列是相同的 - 下面的示例

澄清:

c3 1 63072 1 63072 Not_Equal
c3 18109 29942 13125 25007 Not_Equal
c3 18105 26056 14949 22881 Not_Equal
c3 19004 26038 18102 25145 Not_Equal
c3 14949 22881 18105 26056 Equal
c3 18102 25145 19004 26038 Equal
c3 18090 26038 13562 21528 Not_Equal
c3 18964 26028 18532 25565 Not_Equal
a3 1 63072 1 63072 Not_Equal
a3 13125 25007 18109 29942 Not_Equal

因此,即使最后一行与第二行相同,因为第一列是不同的,也不等于

您可以尝试一次以下(仅在给定样品中测试)。

不检查第1列的条件: 列1st in code的input_file中未考虑使用C/A值。

awk '
FNR==NR{
  a[++count]=$0
  next
}
{
  for(i=1;i<=FNR;i++){
    split(a[i],array," ")
       if($3==array[1] && $2==array[4] && i!=FNR){
           print $0,"Equal"
           next
       }
  }
}
{
  print $0,"NOT Equal"
}'   Input_file  Input_file

代码如何工作:

  • 它将读取input_file 2次。
  • 它将完整的线的值保存到Input_file的第一运行中的数组中。
  • 然后在第二次运行中,它将为每行的每行循环运行一个循环,从1到行值(因此,通过这样做,它应该覆盖所有行对所有行检查。
  • 添加了特定条件(在检查当前行的第三列是否等于数组的第三列(实际上是我们保存在Input_file的第一运行中的第一个字段),并且第二个字段等于第4个字段,等于阵列(这是存储在Input_file的第1行中的第四列线)。如果我们仔细地看到您的第一行具有1 63072 1 63072,其中1个字段等于第3个字段,第二个字段等于第2个字段,因此我添加了条件,不应在此匹配项上执行此匹配同样的行,为避免在这里避免使用此类"误报"。

输出将如下。

1 63072 1 63072 NOT Equal
18109 29942 13125 25007 NOT Equal
18105 26056 14949 22881 NOT Equal
19004 26038 18102 25145 NOT Equal
14949 22881 18105 26056 Equal
18102 25145 19004 26038 Equal
18090 26038 13562 21528 NOT Equal
18964 26028 18532 25565 NOT Equal
14162 21991 10076 17931 NOT Equal
18964 26038 9921 17008 NOT Equal

编辑(在条件检查中添加$ 1):因为OP也希望检查$ 1(带有C/A等值),因此现在也添加该条件检查。

awk '
FNR==NR{
  a[++count]=$0
  b[$1]=$1
  next
}
{
  for(i=1;i<=FNR;i++){
    split(a[i],array," ")
       if(b[$1]==array[1] && $4==array[2] && $2==array[4] && i!=FNR){
           print $0,"Equal"
           next
       }
  }
}
{
  print $0,"NOT Equal"
}'  Input_file  Input_file

输出将如下。

c3 1 63072 1 63072 NOT Equal
c3 18109 29942 13125 25007 NOT Equal
c3 18105 26056 14949 22881 NOT Equal
c3 19004 26038 18102 25145 NOT Equal
c3 14949 22881 18105 26056 Equal
c3 18102 25145 19004 26038 Equal
c3 18090 26038 13562 21528 NOT Equal
c3 18964 26028 18532 25565 NOT Equal
a3 1 63072 1 63072 NOT Equal
a3 13125 25007 18109 29942 NOT Equal



通用解决方案(S)从两者(向下到向上)读取输入_file:

添加1个通用解决方案(上述答案有点增强)。我只认为A=B是正确的,那么B=A也是正确的。含义OP的示例仅从第一行到最后一行。意味着如果第3行的元素(第一列等于第5行的第三列),那么对于第五行的第一列到第三行第3列条件应该是正确的,因此现在它们都应将它们写成等于尝试关注。

不检查第1列的条件:列1st in code的input_file中未考虑使用C/A值。

awk '
FNR==NR{
  a[++count]=$0
  next
}
{
  for(i=1;i<=count;i++){
    split(a[i],array," ")
       if($3==array[1] && $2==array[4] && i!=FNR){
           print $0,"Equal"
           next
       }
  }
}
{
  print $0,"NOT Equal"
}'  Input_file Input_file

edit(在条件检查中添加$ 1):因为OP想要比较$ 1(带有c/a等值),因此现在也更改了解决方案。

awk '
FNR==NR{
  a[++count]=$0
  b[$1]=$1
  next
}
{
  for(i=1;i<=count;i++){
    split(a[i],array," ")
       if(b[$1]==array[1] && $4==array[2] && $2==array[4] && i!=FNR){
           print $0,"Equal"
           next
       }
  }
}
{
  print $0,"NOT Equal"
}'  Input_file  Input_file

输出将如下。

c3 1 63072 1 63072 NOT Equal
c3 18109 29942 13125 25007 NOT Equal
c3 18105 26056 14949 22881 Equal
c3 19004 26038 18102 25145 Equal
c3 14949 22881 18105 26056 Equal
c3 18102 25145 19004 26038 Equal
c3 18090 26038 13562 21528 NOT Equal
c3 18964 26028 18532 25565 NOT Equal
a3 1 63072 1 63072 NOT Equal
a3 13125 25007 18109 29942 NOT Equal

最新更新