我需要比较两个文件,而不是逐行比较,排除通用行,然后使用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.
将此应用于每个文件,我们就得到了结果。
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();
}
}