【发布时间】:2011-12-08 20:09:38
【问题描述】:
我正在尝试 bash 编写此脚本,但似乎我问错了问题或找不到精炼的示例。
我正在获取两个包含列表的文件。
file1:
aa
bb
cc
dd
ee
ff
file2:
bb
dd
ff
创建file3 = file1 行-(匹配file2 中的行,file1 中的任意点)
file3:
aa
cc
ee
感谢任何帮助或指导。
【问题讨论】:
我正在尝试 bash 编写此脚本,但似乎我问错了问题或找不到精炼的示例。
我正在获取两个包含列表的文件。
file1:
aa
bb
cc
dd
ee
ff
file2:
bb
dd
ff
创建file3 = file1 行-(匹配file2 中的行,file1 中的任意点)
file3:
aa
cc
ee
感谢任何帮助或指导。
【问题讨论】:
怎么样
fgrep -v -f file2 file1
【讨论】:
如果可以使用文件,你可以使用这个:
comm -2 -3 <(sort file1) <(sort file2)
我认为描述你想要什么的一种雄辩的方式是相对互补或集合差异。事实上,complment 的 wikipedia page 有许多语言的代码示例,包括我上面的解决方案,没有内联排序。
【讨论】:
comm -2 -3 <(sort smallfile) <(sort largefile) 和comm -2 -3 <(sort largefile) <(sort smallfile) 两种方式都没有给我预期的结果。我今天将再次尝试使用 wiki。谢谢
如果file2 中的每一行都出现在file1 中,那就很简单了:
sort file1 file2 | uniq -u
如果文件无法排序并且你不知道上述条件是否为真(大约每一行),awk可以这样做:
awk 'BEGIN { while ((getline line < "file2" > 0) {
f2[line]++
}
}
f2[$0] > 0 { print }' file1
注意:我不会将它与非常大的 file2 一起使用。
【讨论】: