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

现在我想找出 2 行中 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
  • 我们创建两个数组。 重复
  • 当第一列和第二列出现多次时,我们会增加计数。为此,我们使用 dups 数组。
  • 在我们的 lines 数组中,我们检查是否存储了具有相同第一列和第二列的行。如果有,我们将重复的行附加到它上面。
  • END block 中,我们迭代 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 列与前一列和第二列相同,则打印上一行和当前行。

关于Linux命令查找两个可比较的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23519353/

相关文章:

php - 连接8080端口失败 : Connection refused Error number: 7 (cURL)

linux - Sed 完全匹配

regex - sed 正则表达式中的转义加号

shell - sed:重命名文件中的选择性字符串

linux - Beaglebone am335x 通过 mmap、设置和清除引脚访问 GPIO

java - JVM 错误 : Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

c++ - C++ Linux 中的 HANDLE 数据类型是什么?

json - 用 sed 替换 JSON 中的 bool 字段

linux - Bash 文件名降序排序

linux - 在 Awk split(for 循环)中运行 Sed 命令