Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux命令查找两个可比较的行_Linux_Sed - Fatal编程技术网

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

Linux命令查找两个可比较的行,linux,sed,Linux,Sed,我有以下排序顺序的数据(这里的数据是根据第一个v1、第二个v2、第三个v3和第四个v4排序的): 现在我想找出两行的v1和v2相等的行。i、 e.在以上给出的数据中,我希望找到以下形式的行: v1=2 v2=10630231 v3=60528947 v4=17 v1=2 v2=10630231 v3=60529119 v4=18 我知道如何在python中通过比较连续的行以及何时有匹配输出该行来实现这一点。有没有一种简单的方法可以使用像sed这样

我有以下排序顺序的数据(这里的数据是根据第一个v1、第二个v2、第三个v3和第四个v4排序的):

现在我想找出两行的v1和v2相等的行。i、 e.在以上给出的数据中,我希望找到以下形式的行:

 v1=2    v2=10630231     v3=60528947     v4=17
 v1=2    v2=10630231     v3=60529119     v4=18

我知道如何在python中通过比较连续的行以及何时有匹配输出该行来实现这一点。有没有一种简单的方法可以使用像sed这样的linux命令来完成同样的任务。我知道在给定两个值时如何使用sed来查找单词,但我不知道在这种情况下如何使用sed。非常感谢您的解释。

一种方法是找出行首有多少个字符是相同的(看起来大约是25个?),然后只通过uniq对这些字符进行比较:

uniq --check-chars=25 --repeated < input_file
uniq——检查字符=25——重复

要打印两行,请使用
--all repeated
而不是
--repeated

使用
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
  • 我们创建两个数组<代码>行
    DUP
  • 当第一列和第二列被多次看到时,我们增加计数。为此,我们使用
    dups
    数组
  • 数组中,我们检查是否存储了第一列和第二列相同的行。如果我们有,我们将重复的行附加到它
  • END
    块中,我们迭代
    数组。如果在我们的
    dups
    数组中多次找到第一个和第二列,我们将打印这些行
或者,如果不想将整个文件保存在内存中,可以执行以下操作(因为您声明数据已排序):

  • 我们将变量
    line
    指定为整个当前行,
    c1
    指定为第1列,
    c2
    指定为第2列
  • 如果当前行的第1列和第2列与上一列1和第2列相同,则打印上一行和当前行
首先让我说,您显示的列表在Linux意义上没有严格排序(空格和制表符确实会影响排序)。解决您的问题的最佳Linux解决方案是使用awk。下面是一个命令,它应该执行您正在查找的操作:

awk -e '{cur=$1 " " $2; if (NR>1 && cur==prev) {print "line:"NR " " cur} prev=cur}' < input_file
awk-e'{cur=$1”“$2;如果(NR>1&&cur==prev){print”行:“NR”“cur}prev=cur}”
所有这一切只是将我们称之为cur的输入文件的第一列和第二列的组合所形成的字符串($1和$2;由更干净的输出空间分隔)与我们称之为prev的前一输入行中的相同字符串进行比较。如果两个字符串匹配,则输出行号和结果。我们还添加了一个条件来跳过文件的第一行,因为还没有可比较的内容。

这可能适用于您(GNU-sed):

这将使用反向引用比较两行,并打印与前两个值重复的行

但是,如果副本可能是三条或更多连续线,则可以使用另一种方法。使用保持缓冲区打印和标记副本。当一个重复行后接一个非重复行时,也会打印最后一个重复行,并重置标志:

sed -rn '$!N;/^\s*(\S+)\s+(\S+)\s+.*\n\s*\1\s+\2/{h;P;D};x;/./{z;x;P;D};x;D' file

可能是@tripleee的重复对不起,但是这个问题是关于joinshey的,这真的很酷。你能给我指一下我可以从中了解awk的链接吗more@JannatArora当然,一个好的起点应该是并且是一个明确的指南。对于解析一次解决方案和解释+1。但是请记住,
(y中的x)
并没有保持插入顺序。@JannatArora Kent是对的。即使以前的解决方案将同时打印DUP,这些DUP的顺序也可能与文件中显示的顺序不同。如果顺序很重要,我添加了另一个解决方案,该解决方案假定文件按照您在问题中所述的顺序进行排序。+1。你能解释一下吗?我对awkNotice不太熟悉,这是一种在线算法,意味着无论输入文件有多大,它都不需要增加内存或跟踪保存的数据。请解释什么不起作用。有了您提供的测试数据,它工作得非常好。
awk -e '{cur=$1 " " $2; if (NR>1 && cur==prev) {print "line:"NR " " cur} prev=cur}' < input_file
sed -rn '$!N;/^\s*(\S+)\s+(\S+)\s+.*\n\s*\1\s+\2/p;D' file
sed -rn '$!N;/^\s*(\S+)\s+(\S+)\s+.*\n\s*\1\s+\2/{h;P;D};x;/./{z;x;P;D};x;D' file