我有两个文本文件,file1.txt 和 file2.txt。
file1.txt 包含一个数字列表。file2.txt 还包含一个数字列表,但数量更多(很大一部分是来自 file1.txt 的数字)。这就是我想要做的:
我想从 file2.txt 中删除 file1.txt 中的所有数字,并将输出保存到 file3.txt。所以在 file3.txt 中,它将不包含 file1.txt 中的数字。我怎样才能做到这一点?
我有两个文本文件,file1.txt 和 file2.txt。
file1.txt 包含一个数字列表。file2.txt 还包含一个数字列表,但数量更多(很大一部分是来自 file1.txt 的数字)。这就是我想要做的:
我想从 file2.txt 中删除 file1.txt 中的所有数字,并将输出保存到 file3.txt。所以在 file3.txt 中,它将不包含 file1.txt 中的数字。我怎样才能做到这一点?
这是一种使用方法awk
:
awk 'FNR==NR { a[$0]; next } !($0 in a)' file1.txt file2.txt > file3.txt
这会将file1读入一个数组,然后在遍历file2时,它将打印不在数组中的file2行并将它们写入输出文件。如果您有任何问题,请不要犹豫。干杯。
使用 GNU grep
,您可以使用 ' fgrep
' 模式:
grep -F -v -f file1.txt -w file2.txt > file3.txt
演示:
seq 1 30 > file2.txt
for i in 1 2 3 4 5; do echo $RANDOM; done | sed 's/\(..\).*/\1/' > file1.txt
grep -F -v -f file1.txt -w file2.txt > file3.txt
的内容file2.txt
是数字 1 到 30 的行。 的内容file1.txt
是 5 个半随机的 2 位数字。中的输出file3.txt
是文件 2 中不在文件 1 中的行。请注意,循环生成的随机数不是很好,也没有限制为 1..30(另请参见下面的注释)。
GNU 特有的特性是grep
标志-w
,它匹配整个单词。有趣的是,POSIX 2008 指定-x
应该与精确的行匹配,并且该-x
选项对我来说可以正常工作(在 Mac OS X 10.7.5 上,但/usr/bin/grep
在 GNU grep 2.5.1 上)。从理论上讲,-x
它更便携。由于它也在POSIX 1997标准中,因此应该可以广泛使用。-w
如果单行上有多个数字(但grep
会消除整行),则该选项会更合适。
您只想打印 file2.txt 的唯一元素。这就是该comm
实用程序的设计目的:
comm -13 <(sort file1.txt) <(sort file2.txt)
测试
$ cat file1.txt
5
4
6
2
10
$ cat file2.txt
3
7
8
2
4
1
9
10
5
6
$ comm -13 <(sort file1.txt) <(sort file2.txt)
1
3
7
8
9
sort file1.txt file2.txt|uniq -u > file3.txt
您可以使用 unix“diff”命令获取差异并过滤掉不需要的行。您可以使用--changed-group-format和--unchanged-group-format选项来过滤所需的数据。
以下三个选项可用于为每个选项选择相关组:
'%<' 从 FILE1 获取行
'%>' 从 FILE2 获取行
''(空字符串)用于从两个文件中删除行。
例如:
diff --changed-group-format="%>" --unchanged-group-format="" file1.txt file2.txt > file3.txt
你能提供更多关于这些数字是如何格式化的信息吗?他们每个人都在新线上吗?它们的位数都相同吗?
编辑:收到评论后:
while read line
do
bool="false"
while read secLine
do
if [ "$line" == "$secLine" ]
then
bool="true"
fi
done <file1
if [ "$bool" == "false" ]
then
echo $line >> file3.txt
fi
done <file2
这将起作用,尽管通过蛮力(或者它应该起作用。检查语法错误。我没有看到任何但可能有一些。)这可能需要一段时间,具体取决于你有多少数字。