我有两个文本文件,file1.txt和file2.txt。
file1.txt包含一个数字列表。 file2.txt还包含一个数字列表,但是它们中的更多(一个好的块是来自file1.txt的数字)。这就是我想要做的事情:
我想从file2.txt中删除file1.txt中的所有数字,并将输出保存到file3.txt。所以在file3.txt中,它不包含file1.txt中的数字。我怎么能做到这一点?
答案 0 :(得分:4)
这是使用awk
的一种方式:
awk 'FNR==NR { a[$0]; next } !($0 in a)' file1.txt file2.txt > file3.txt
这将file1读入一个数组,然后当迭代通过file2时,它将打印不在数组中的file2行并将它们写入输出文件。如果您有任何疑问,请不要犹豫。欢呼声。
答案 1 :(得分:2)
使用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
会消除整行)。
答案 2 :(得分:1)
sort file1.txt file2.txt|uniq -u > file3.txt
答案 3 :(得分:1)
您可以使用unix“diff”命令获取差异并过滤掉不需要的行。您可以使用 - 已更改组格式和 - 未更改组格式选项来过滤所需数据。
以下三个选项可用于为每个选项选择相关组:
'%<'从FILE1获取行
'%>'从FILE2获取行
''(空字符串)用于从两个文件中删除行。
e.g:
diff --changed-group-format="%>" --unchanged-group-format="" file1.txt file2.txt > file3.txt
答案 4 :(得分:0)
您能否提供一些有关如何格式化这些数字的更多信息?他们每个人都在新线上吗?它们的位数是否相同?
编辑:收到评论后:
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
这会起作用,虽然是暴力(或它应该有效。检查语法错误。我没有看到任何但可能有一些。)这可能需要一段时间取决于你有多少数字。
答案 5 :(得分:0)
您只想打印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