在shell中逐行比较2个文件

时间:2014-03-21 18:26:19

标签: shell filecompare

我需要逐行比较两个文件,排除公共行,然后使用shell命令输出不同的所有内容。

示例:

文件1:

5
124
346
12
65
8
78

文件2:

10
23
129494
5
493
124
4999
346

输出:

12
65
8
78
129494
943
4999

谢谢

好的,让我添加一些细节: 我有一些文件,包括IP对。

示例:

文件1:

55.4.56.11 10.22.123.43  10.22.123.43 147.34.123.43  147.34.23.2 23.124.251.1

文件2:

123.4.23.89 121.45.60.0  121.45.60.0 0.0.0.0  120.3.2.129 45.55.68.09  45.55.68.09 66.67.23.111  55.4.56.11 10.22.123.43

所以在这个例子中,我需要输出两个文件的每一行,除了: 55.4.56.11 10.22.123.43

这意味着我不能使用数字比较。同时整理文件也没有帮助,因为它可能有不同的行数。我需要像" global"两个文件的比较。 如果你们需要更多细节,我很乐意进一步编辑我的帖子。感谢您的时间。 (我不能让第二个例子看起来像第一个,我不知道为什么,但假设每两个IPS之后有一个换行符)

4 个答案:

答案 0 :(得分:2)

使用grep:

grep -xv -f f2 f1 && grep -xv -f f1 f2
12
65
8
78
10
23
129494
493
4999

答案 1 :(得分:1)

这是comm command和流程替换的良好候选者。

comm -3 <(sort -un f1) <(sort -un f2)

如果你想要一个平面输出文件,你需要通过comm命令

修剪前导空白输出
comm -3 <(sort -un f1) <(sort -un f2) | tr -d '\t'

答案 2 :(得分:0)

使用java:

   import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.HashSet;
    import java.util.Set;

    public class ComapreServerPackage {

        public static void main(String[] args) throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

            System.out.println("Path of source file : ");
            String sourceFilePath = reader.readLine();

            System.out.println("Path of target file : ");
            String targetFilePath = reader.readLine();

            File sourceFile = new File(sourceFilePath);
            File taregtFile = new File(targetFilePath);

            BufferedReader fileReader = new BufferedReader(new FileReader(sourceFile));

            String readLine = "";

            System.out.println("Comparing ...");


            Set <String> sourceSet = new HashSet();

            // file source set 
            while ((readLine = fileReader.readLine()) != null) {
                sourceSet.add(readLine);
            }

            fileReader.close();
            fileReader =  new BufferedReader(new FileReader(taregtFile));

            System.out.println("Lines not available in source file are : ");
            // file source set 
            while ((readLine = fileReader.readLine()) != null) {
                if(!sourceSet.contains(readLine))
                    System.out.println(readLine);
            }

            System.out.println("*************** end *********************");
            reader.close();
            fileReader.close();

        }

    }

答案 3 :(得分:0)

带有awk的替代解决方案:

awk 'BEGIN { while ( getline < "f2.txt" > 0 ) _[$1]++ }{if (!($1 in _)) {print $1}}' f1.txt && awk 'BEGIN { while ( getline < "f1.txt" > 0 ) _[$1]++ }{if (!($1 in _)) {print $1}}' f2.txt

  

详细信息:

awk 'Command1 Command2' fileName

Command1:BEGIN { while ( getline < "f2.txt" > 0 ) _[$1]++ } 读取f2.txt中的每一行并存储到数据结构中。

Command2:{if (!($1 in _)) {print $1}}对于awk处理的文件f1.txt中的每一行,打印f2.txt中不存在的行

fileName:f1.txt文件由awk处理。

这将应用于每个文件,我们得到结果。