【问题标题】:print lines from one file that contain in another file [duplicate]打印一个文件中包含在另一个文件中的行[重复]
【发布时间】:2014-09-10 14:21:54
【问题描述】:

我有两个文件 file1 和 file2。 file1 有 63000 行,file2 有 6000 行。我需要打印两个文件中的行。

文件1

1bl9
1bln_2
1bln_3
1blx
1blx
1bm3
1bm3
1bm9_1
1bm9_2
1bm9_1
1bm9_2

文件2

1blx
1blx
1bm4
1bln_2

输出

1blx
1blx
1bln_2

我使用了以下程序。但它适用于行数较少的文件。它不适用于具有大量行的文件。

awk 'FNR==NR { a[$0]; next } $0 in a' file2 file1

【问题讨论】:

  • “它不起作用”信息不足。它以什么方式不起作用?什么是“大量行”?
  • @abar 使用更稳定的 Awk,它可以处理像 GNU Awk 这样的大行,或者使用其他语言,如 Perl、Python 或 Ruby。
  • @ooga file1 有 63000 行,file2 有 6000 行。我的代码不适用于这些文件。但是如果我减少行数,我的代码就可以工作了。
  • 再次,在什么意义上它不起作用?发生什么了?你得到输出,但输出不正确?你没有得到任何输出吗?我注意到您首先放置了较小的文件,所以这就是您正在读入数组的文件。这些线条看起来像你上面显示的吗?这些非常小的行中的 6000 行并不占用太多内存。你在什么系统上?
  • @ooga 我没有得到任何输出。这些行看起来像上面的例子。我使用的是 ubuntu 14.04 LTS。我无法得到解决方案。

标签: awk gawk


【解决方案1】:

只需使用fgrepgrep -F-f

fgrep -f file1 file2

或者使用awk:

awk 'NR==FNR{a[$0]++;next}a[$0]' file1 file2

两个输出

1blx
1blx
1bln_2

注意:您应该确保您的文件是 UNIX 格式:

sed -i.bak 's|\r||' file1 file2

或者使用dos2unix(每个文件只使用一次):

dos2unix file1
dos2unix file2

【讨论】:

  • 非常感谢您的回答。您的代码适用于给定的示例。但它不适用于我的原始文件。
  • grep -Ff 是个好主意!我认为awk 示例中的a[$0] 模式应该是$0 in a,以避免不必要地将空字符串(更不用说键)添加到a,因为我相信普通a[$0] 会发生这种情况。
猜你喜欢
  • 2011-08-14
  • 2012-10-29
  • 1970-01-01
  • 2016-12-14
  • 2011-07-17
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
相关资源
最近更新 更多