linux - Linux命令查找两个可比较的行

原文 标签 linux sed

我有以下排序顺序的数据(这里的数据是按照第一个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中通过比较连续的行和每当有匹配输出行时执行此操作。有没有一种简单的方法可以使用linux命令(如sed等)来完成同样的工作。我知道在给定两个值时如何使用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列相同,则打印前一行和当前行。

相关文章:

python - 在Linux中设置python脚本的日期/时间

linux - 在Linux中,如何找到包含大多数子目录或文件的查找目录? [关闭]

regex - 当区域重叠时,Sed不会替换文件中的所有实例

regex - 为什么sed需要3个反斜杠来进行常规反斜杠?

regex - 如果第二行包含与第一行相同的匹配项,如何打印两行?

linux - 如何在init脚本中以特定用户身份运行命令?

c - 如何获取NFS文件句柄?

c - 为什么这会产生“可能被破坏……”的警告?

sed - 如何使用sed交换两列?

regex - 使用Regex从fasta文件中获取特定序列