unix命令查找两个文件中常见的行(代码片段)

author author     2022-12-27     376

关键词:

我确定我曾经发现一个unix命令可以打印两个或多个文件中的公共行,有人知道它的名字吗?它比diff简单得多。

答案

你正在寻找的命令是comm。例如:-

comm -12 1.sorted.txt 2.sorted.txt

这里:

-1:禁止第1列(1.sorted.txt唯一的行)

-2:抑制第2列(2.sorted.txt唯一的行)

另一答案

仅供参考,如果有人仍在查看如何为多个文件执行此操作,请参阅Finding matching lines across many files.的链接答案


结合这两个答案(ans1ans2),我认为你可以得到你需要的结果,而无需对文件进行排序:

#!/bin/bash
ans="matching_lines"

for file1 in *
do 
    for file2 in *
        do 
            if  [ "$file1" != "$ans" ] && [ "$file2" != "$ans" ] && [ "$file1" != "$file2" ] ; then
                echo "Comparing: $file1 $file2 ..." >> $ans
                perl -ne 'print if ($seen$_ .= @ARGV) =~ /10$/' $file1 $file2 >> $ans
            fi
         done 
done

只需保存它,给它执行权(chmod +x compareFiles.sh)并运行它。它将获取当前工作目录中存在的所有文件,并将在“matching_lines”文件中进行全对比比较结果。

有待改进的地方:

  • 跳过目录
  • 避免两次比较所有文件(file1 vs file2和file2 vs file1)。
  • 也许在匹配字符串旁边添加行号
另一答案
rm file3.txt

cat file1.out | while read line1
do
        cat file2.out | while read line2
        do
                if [[ $line1 == $line2 ]]; then
                        echo $line1 >>file3.out
                fi
        done
done

这应该做到这一点。

另一答案

要轻松将comm命令应用于未排序的文件,请使用Bash的process substitution

$ bash --version
GNU bash, version 3.2.51(1)-release
Copyright (C) 2007 Free Software Foundation, Inc.
$ cat > abc
123
567
132
$ cat > def
132
777
321

所以文件abc和def有一条共同的行,一行是“132”。在未排序的文件上使用comm:

$ comm abc def
123
    132
567
132
    777
    321
$ comm -12 abc def # No output! The common line is not found
$

最后一行没有产生输出,没有发现公共线。

现在使用comm对已排序的文件,使用进程替换对文件进行排序:

$ comm <( sort abc ) <( sort def )
123
            132
    321
567
    777
$ comm -12 <( sort abc ) <( sort def )
132

现在我们得到了132线!

另一答案

为了补充Perl单线,这里是它的awk等价物:

awk 'NR==FNRarr[$0];next $0 in arr' file1 file2

这将读取从file1到数组arr[]的所有行,然后检查file2中的每一行,如果它已经存在于数组中(即file1)。找到的行将按照它们在file2中出现的顺序打印。请注意,比较in arr使用file2中的整行作为数组的索引,因此它只会在整行上报告完全匹配。

另一答案

也许你的意思是comm

逐行比较已排序的文件FILE1和FILE2。

没有选项,产生三列输出。第一列包含FILE1特有的行,第二列包含FILE2特有的行,第三列包含两个文件共有的行。

查找这些信息的秘诀是信息页面。对于GNU程序,它们比人工页面更详细。尝试info coreutils,它会列出所有小的有用的工具。

另一答案

grep -v -f 1.txt 2.txt > 3.txt

给你两个文件的差异(2.txt中的内容,而不是1.txt中的内容),你可以很容易地做到

grep -f 1.txt 2.txt > 3.txt

收集所有常见的行,这应该为您的问题提供简单的解决方案。如果你有分类文件,你应该采取comm。问候!

另一答案
perl -ne 'print if ($seen$_ .= @ARGV) =~ /10$/'  file1 file2
另一答案
awk 'NR==FNRa[$1]++;next a[$1] ' file1 file2
另一答案

如果这两个文件尚未排序,您可以使用:

comm -12 <(sort a.txt) <(sort b.txt)

并且它将工作,避免在做comm: file 2 is not in sorted order 时的错误消息comm -12 a.txt b.txt

另一答案

在Linux的有限版本上(就像我正在研究的QNAP(nas)):

  • comm不存在
  • grep -f file1 file2会引起一些问题,正如@ChristopherSchultz所说,使用grep -F -f file1 file2真的很慢(超过5分钟 - 没有完成它 - 超过2-3秒,使用下面的方法超过20MB的文件)

所以这就是我所做的:

sort file1 > file1.sorted
sort file2 > file2.sorted

diff file1.sorted file2.sorted | grep "<" | sed 's/^< *//' > files.diff
diff file1.sorted files.diff | grep "<" | sed 's/^< *//' > files.same.sorted

如果files.same.sorted的顺序与原始顺序相同,则将此行添加到与file1相同的顺序:

awk 'FNR==NR a[$0]=$0; next; $0 in a print a[$0]' files.same.sorted file1 > files.same

或者,与file2相同的顺序:

awk 'FNR==NR a[$0]=$0; next; $0 in a print a[$0]' files.same.sorted file2 > files.same

如何从unix中有两个已知和未知字符串的文件中grep?(代码片段)

...list;path"//ANDbetweenbothpatternsasbotharerequiredinordertogrepaline这个命令几乎可以满足我想要的所有 查看详情

在两个xlsx文件之间查找相同的行(代码片段)

我刚刚看到几个帖子,但我找不到解决方案。我试图在Python中使用Pandas比较不同工作簿中的2个Excel文件。WORK1:ABC111222333WORK2:ABC111252333欲望输出:ABC111333到目前为止,我得到的是:importpandasaspddf1=pd.read_excel('/path/work1.xlsx')df2=pd.re... 查看详情

公司更名(代码片段)

附:linux几种常见的文件内容查找和替换命令1、vi命令下的查找和替换1.1vi下的查找/pattern<Enter>:向下查找pattern匹配字符串?pattern<Enter>:向上查找pattern匹配字符串使用了查找命令之后,使用如下两个键快速查找:n:按... 查看详情

如何在unix下使用sed命令

sed命令是一个十分复杂的文字处理命令,其中有很多的参数和格式,但可以实现几乎所有的字符处理需求,常用的几个参数如下。①sed'1,3d'f1:显示除第一行和第三行之外的行,“1,3”表示第一行和第三行,“d”表示删除... 查看详情

sh删除两个dates_hours之间的所有文件-unix命令行(代码片段)

查看详情

linux:grep命令检索文件内容详解(代码片段)

...系统中搜索、查找文件中的内容,一般最常用的是grep命令,另外还有egrep命令,同时vi命令也支持文件内容检索。下面来一起看看Linux利用grep命令检索文件内容的详细介绍。方法如下:1、搜索某个文件里面是否包... 查看详情

find命令(代码片段)

从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行find/-typef-name"*.log"|xargsgrep"ERROR"例子:从当前目录开始查找所有扩展名为.in的文本文件,并找出包含”thermcontact”的行find.-name"*.in"|xargsgrep"thermcontact"找到以d... 查看详情

比较两个excel文件并返回不常见的行

】比较两个excel文件并返回不常见的行【英文标题】:Comparetwoexcelfilesandreturnnoncommonrows【发布时间】:2021-07-1204:42:19【问题描述】:我有两个如下所示的excel文件-File1.xlsx文件2.xlsx我想比较每一行和每一列,并从两个文件中删除共... 查看详情

在 /var 目录中查找 catalina.out 文件的 unix 命令是啥?

】在/var目录中查找catalina.out文件的unix命令是啥?【英文标题】:Whatistheunixcommandtofindcatalina.outfilein/vardirectory?在/var目录中查找catalina.out文件的unix命令是什么?【发布时间】:2016-07-0818:02:35【问题描述】:在/var目录中查找catalina.... 查看详情

php有限内存处理大文件(从两个文件提取相同行)(代码片段)

...到此问题,首先先尝试从小范围解决,比如题目中,要求查找两个文件相同的行,那么我们可以先读取文件到内存中(数组),然后通过array_intersect()函数获取两个数组的交集,即为相同的行,此 查看详情

diffpatch命令制作补丁(代码片段)

diff命令diff可以比较两个文件,并可同时记录下二者的区别。制作补丁时的一般用法和常见选项为:diff【选项】源文件(夹)目的文件(夹)-r:递归,设置后diff会将两个不同版本源代码目录中的所有对应文件都进行一次比较,... 查看详情

linux下文本查找技巧你掌握了吗?(代码片段)

前言之前介绍过很多linux下查找相关的命令,例如《Linux中的文件查找技巧》,《find命令高级用法》,《如何查看linux中文件打开情况-lsof命令》等等,而对文件内容搜索的命令似乎还没有涉及,因此本文介绍文本搜索命令--grep。... 查看详情

查找已安装软件(代码片段)

rpm-qa|grephttpdrpm–qa–a选项是查询所有已经安装的软件包。-q是查询一个包是否安装greplinux系统命令中最重要的命令之一,功能是从文本文件,或者管道数据流中筛选出匹配到的行或数据,如果再配合正则表达式,功能将十分强大 查看详情

50个最常用的unix/linux命令(代码片段)

...w.thegeekstuff.com/2010/11/50-linux-commands/这些都是一些很常用的命令,这篇文章中每个命令都有一些简单的示例说明它的用法,对于想学习Unix/Linux的人,这些命令基本上都是需要掌握的:targrepfindsshsedawkvimdiffsortexportargslspwdcdgzipbzip2unzip... 查看详情

unix命令,统计当前目录(含子目录)下所有后缀为.log的文件中error出现的行数

我就知道个统计当前目录(含子目录)下后缀为.log的文件个数find.-name"*.log"|wc-l如何统计.log文件中ERROR出现的行数?参考技术Aforlogfilein`find.-name"*.log"`doecho"$logfile:"sed-n'/ERROR/='$logfiledonesed里面,/ERROR/表... 查看详情

java示例代码_在java中查找两个unix时间戳之间的天数

java示例代码_在java中查找两个unix时间戳之间的天数 查看详情

grep搜索文本命令(代码片段)

grep命令用于搜索文本内容,输出所匹配字符串的行。命令格式grep[查找的内容][文本文件]搜索文本文件中内容:#搜索文件textfile中zqqgrepzqqtextfile显示匹配行和匹配行所在行号,-n参数:grep-nzqqtextfile反向搜索,... 查看详情

grep搜索文本命令(代码片段)

grep命令用于搜索文本内容,输出所匹配字符串的行。命令格式grep[查找的内容][文本文件]搜索文本文件中内容:#搜索文件textfile中zqqgrepzqqtextfile显示匹配行和匹配行所在行号,-n参数:grep-nzqqtextfile反向搜索,... 查看详情