我的数据按以下排序顺序(此处是按照第一个v1,v2,v3和v4排序的数据):

v1=1    v2=8513481      v3=119330184    v4=0
 v1=1    v2=8521383      v3=119330182    v4=0
 v1=1    v2=10630231     v3=60529116     v4=18
 v1=1    v2=60528877     v3=60529221     v4=17
 v1=1    v2=90351079     v3=90351078     v4=20
 v1=1    v2=271669588    v3=271669683    v4=101
 v1=2    v2=8513481      v3=10583646     v4=0
 v1=2    v2=10175437     v3=10175436     v4=0
 v1=2    v2=10630231     v3=60528947     v4=17
 v1=2    v2=10630231     v3=60529119     v4=18
 v1=2    v2=10630232     v3=605291191     v4=18

现在,我想找出两行的v1和v2相等的行。即在上面给出的数据中,我想找到以下形式的行:
 v1=2    v2=10630231     v3=60528947     v4=17
 v1=2    v2=10630231     v3=60529119     v4=18

我知道如何在python中通过比较连续的行以及何时有匹配项输出行来做到这一点。有没有一种简单的方法可以使用sed等linux命令执行相同的操作。我知道在给定两个值时如何使用sed查找单词,但是在这种情况下我不知道如何使用sed。高度赞赏的解释。

最佳答案

使用awk会更容易一些:

awk '{
    lines[$1,$2]=(lines[$1,$2]?lines[$1,$2] RS $0:$0)
    dups[$1,$2]++
}
END {
    for(line in lines)
        if(dups[line]>1) print lines[line]
}' file
v1=2    v2=10630231     v3=60528947     v4=17
v1=2    v2=10630231     v3=60529119     v4=18
  • 我们创建两个数组。 linesdups
  • 当第一列和第二列被多次查看时,我们将增加计数。我们为此使用dups数组。
  • lines数组中,我们检查是否存储了具有相同的第一列和第二列的行。如果有,我们将重复的行添加到它。
  • END块中,我们遍历lines数组。如果在dups数组中多次发现第一和第一列,我们将打印这些行。

  • 或者,如果您不想将整个文件保留在内存中,则可以执行以下操作(因为您声明数据已经排序):
    awk '($1==c1 && $2==c2){print line RS $0}{line=$0;c1=$1;c2=$2}' file
    
  • 我们将变量line分配为您的整个当前行,将c1分配为第1列,将c2分配为第2列。
  • 如果当前行的第1列和第2列与上一列和第2列相同,则打印前一行和当前行。
  • 关于linux - Linux命令查找两个可比较的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23519353/

    10-15 13:50