【问题标题】:grep - how could I search a file for numbers from second filegrep - 我如何在文件中搜索第二个文件中的数字
【发布时间】:2014-08-23 19:03:51
【问题描述】:

我有两个数字列表

file1 有名字和编号

alaska5554443333
california5556667777
hawaii5555559999

file2 只有数字,但只有前 6 个

555333
555999
555222

我怎样才能搜索 file1 并从 file2 中取出任何匹配项,同时只查看前 6 个数字,这样我就不会意外地从数字的中间或末尾取出匹配项?

当我有完整的数字时,我使用 grep -v -f file2 file1 > file3 浏览了文件,以便从 file1 中提取所有在 file2 中不匹配的名称和数字。

【问题讨论】:

  • 555333 file1 的前 6 个怎么样?
  • 不是,我要做的是确保 file2 中的 555999 不会从 file1 中取出第三个条目,即 hawaii555555999

标签: regex macos shell scripting grep


【解决方案1】:

您需要对文件 2 进行预处理。

sed 's/^/^[^0-9]+/' < file2 | egrep -v -f - file1

这会在 file2 中的每个数字之前添加一个正则表达式。该表达式查找一串非数字,后跟 file2 每一行的数字。

egrep 然后使用这些模式从 file1 中排除行。

【讨论】:

  • 我试过这样做,但现在根本没有打印任何东西。
  • @dom 对不起,我有一个错字。
  • 我又试了一次,但似乎还是不行。我确认我有匹配运行脚本,但它没有做任何事情。我对这种脚本仍然很陌生,所以我很可能会遗漏一些东西。我正在浏览一个长约 60,000 的 6 位数字列表,并将其与另一个 300,000 个条目的列表进行核对。如果这有所不同,它们都会被排序。我认为这可能是一个问题,因为它的逗号分隔但我在使用 tr -d ','
  • 我现在正在尝试了解 SED,我可以切换我的列表,使数字排在前面。我将如何创建一个只查看第一个数字的模式?我想我可以使用 sed '1,6 作为范围,但我不确定如何根据 file2 中的行为其指定模式。
  • @dom 300,000 个条目?您使用了错误的工具来完成这项工作 - 您无法制作包含 300,000 个条目的正则表达式!将您的数据放入数据库中。
【解决方案2】:

我会为此使用

open NAMESANDNUMS, "<namesandnums.txt" or die $!;
my @namesandnums = <NAMESANDNUMS>;
close NAMESANDNUMS or die $!;

open NUMBERS, "<numbers.txt" or die $!;
my @numbers = <NUMBERS>;
close NUMBERS or die $!;

foreach(@namesandnums) {
    if(/[a-z]+(\d{6})/) {
        my $cnum = $1;
        foreach(@numbers) {
            print $_ if($_ == $cnum);
        }
    }
}

【讨论】:

  • 我不熟悉 perl,我昨天才开始这个项目,当我尝试在 shell 脚本中运行它时,它告诉我 -bash 权限被拒绝。
  • 我收到一条错误消息,提示无法识别字符 \x80;标记为
  • @dom 通常,Perl 脚本都有一个.pl 扩展名。不过,这可能不是问题。
  • 我也注意到了这一点并对其进行了更改,但没有解决。我现在正在看一些 Perl 教程,希望我能解决这个问题。
  • 脚本没有运行的原因是因为它的引号错误。我修复了它,它运行了几秒钟,但没有任何反应。它不会在终端中打印任何内容,也不会更改文件。
猜你喜欢
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多