在shell中逐行比较两个文件



我需要比较两个文件,而不是逐行比较,排除通用行,然后使用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.4310.22.123.43 147.34.123.43147.34.23.2 23.124.251.1

文件2:

123.4.23.89 121.45.60.0121.45.60.0 0.0.0.0120.3.2.129 45.55.68.0945.55.68.09 66.67.23.11155.4.56.11 10.22.123.43

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

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

使用grep:

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

这是comm命令和进程替换的一个很好的候选。

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

如果您想要一个平坦的输出文件,您将需要通过comm命令

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

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 file by awk.

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

使用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();
        }
    }

相关内容

  • 没有找到相关文章

最新更新