【问题标题】:find difference between two text files with one item per line [duplicate]查找两个文本文件之间的差异,每行一项[重复]
【发布时间】:2011-05-03 23:56:06
【问题描述】:

我有两个文件:

文件 1

dsf
sdfsd
dsfsdf

文件 2

ljljlj 
lkklk 
dsf
sdfsd
dsfsdf

我想显示文件 2 中的内容,而不是文件 1 中的内容,因此文件 3 应该是这样的

ljljlj 
lkklk 

【问题讨论】:

    标签: bash file scripting sed awk


    【解决方案1】:
    grep -Fxvf file1 file2
    

    标志的含义:

    -F, --fixed-strings
                  Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.    
    -x, --line-regexp
                  Select only those matches that exactly match the whole line.
    -v, --invert-match
                  Invert the sense of matching, to select non-matching lines.
    -f FILE, --file=FILE
                  Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.
    

    【讨论】:

    • 选项-n可以添加到不同的行编号
    • 有什么方法可以突出显示每行不匹配的部分?
    • 有了这个你可以只找到第一个区别并打印它的行号:grep -m 1 -Fnxvf file1 file2
    • 处理大文件效率很低。
    【解决方案2】:

    你可以试试

    grep -f file1 file2
    

    grep -v -F -x -f file1 file2
    

    【讨论】:

    • 这行不通。尝试将dsfblah 添加到file2。
    • 你可以用grep -F -x修复它
    • 我认为您的建议值得编辑答案@tripleee
    • 请注意,文件的顺序很重要。我正在尝试检测文件的新添加。我必须写grep -v -f oldfile newfile,否则它什么也不会输出。
    • 想象一下:git add file1. git 提交。猫文件 2 > 文件 1。混帐差异。 ?
    【解决方案3】:

    您可以使用comm 命令比较两个已排序的文件

    comm -13 <(sort file1) <(sort file2)
    

    【讨论】:

    • 仅供参考,实际上是comm -1 -3 file1 file213 两个标志合并为一个。
    • comm -23
    【解决方案4】:

    我成功使用了

    diff "${file1}" "${file2}" | grep "<" | sed 's/^<//g' > "${diff_file}"
    

    将差异输出到文件。

    【讨论】:

    • 有什么比使用差异工具更好的方法来发现差异哈哈。使用 this 与 grep 相比是否有更高的开销?
    【解决方案5】:

    如果您希望它们按特定顺序排列,您可以使用diff

    diff file1 file2 | grep "&gt;"

    【讨论】:

      【解决方案6】:
      join -v 2 <(sort file1) <(sort file2)
      

      【讨论】:

        【解决方案7】:

        A 尝试对Luca 的回答稍作改动,它对我有用。

        diff file1 file2 | grep ">" | sed 's/^> //g' > diff_file
        

        请注意,在 sed 中搜索到的模式是 &gt; 后跟一个空格。

        【讨论】:

          【解决方案8】:
          文件1 米1 平方米 立方米 文件2 平方米 m4 m5 >awk 'NR == FNR {file1[$0]++; next} !($0 in file1)' file1 file2 m4 m5 >awk 'NR == FNR {file1[$0]++; next} ($0 in file1)' file1 file2 平方米 > 获取“m1 和 m3”的 awk 命令是什么?如在file1中而不是在file2中? 米1 立方米

          【讨论】:

            【解决方案9】:

            如果你想使用循环,你可以这样尝试:(diff 和 cmp 效率更高。)

            while read line
            do
                flag = 0
                while read line2
                do
                   if ( "$line" = "$line2" )
                    then
                        flag = 1
                    fi
                 done < file1 
                 if ( flag -eq 0 )
                 then
                     echo $line > file3
                 fi
            done < file2
            

            注意:该程序只是为了提供一个基本的见解,如果您不想使用系统调用,例如 diff n comm..

            【讨论】:

              【解决方案10】:

              一个 awk 答案:

              awk 'NR == FNR {file1[$0]++; next} !($0 in file1)' file1 file2

              【讨论】:

                【解决方案11】:

                使用 GNU sed:

                sed 's#[^^]#[&]#g;s#\^#\\^#g;s#^#/^#;s#$#$/d#' file1 | sed -f- file2
                

                工作原理:

                第一个sed 产生如下输出:

                /^[d][s][f]$/d
                /^[s][d][f][s][d]$/d
                /^[d][s][f][s][d][f]$/d
                

                然后它被第二个sed用作sed脚本。

                【讨论】:

                  猜你喜欢
                  • 2014-02-02
                  • 2011-04-02
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-09-28
                  • 1970-01-01
                  相关资源
                  最近更新 更多