我需要逐行比较两个文件,排除公共行,然后使用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之后有一个换行符)
答案 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处理。
这将应用于每个文件,我们得到结果。