awk:仅当所有单词与数组中的某些单词匹配时才打印行

时间:2014-07-03 07:24:06

标签: awk grep

我不太了解awk来完成我想在这里完成的任务。也许应该使用别的东西?我有两个csv文件。一个非常大,有近500,000行,另一个可能有1,000到30,000行。

文件1包含第3栏中的句子列表。

文件2包含第1列中常用单词的列表。

如何仅打印文件1中仅包含文件2列表中的完整单词的行?这可能是非常基本的。如果之前有人问过我很抱歉,但我找不到答案。

文件1:

239493     eng     Ice is cold.
393939     eng     Freshwater turns to ice when the temperature drops below zero degrees centigrade.
383822     eng     Lava is hot.
330209     eng     Lava is very hot.
330207     eng     Bacon is tasty.

文件2:

ice
lava
cold
is
hot
bacon
narwhale
midnight

输出:

239493     eng     Ice is cold.
383822     eng     Lava is hot.

2 个答案:

答案 0 :(得分:3)

您可以尝试此awk

awk 'NR==FNR{a[toupper($1)]++;next} {f=3; for(i=3;i<=NF;i++){ if(toupper($i) in a){f++} } if(f==NF){print $0}}' file2 file1

答案 1 :(得分:0)

使用Perl:

perl -lane '
  BEGIN { $x = pop; %h = map { chomp; lc $_ => 1 } <>; @ARGV = $x }
  print if scalar @F - 2 == scalar grep { $_ } map { s/\W//g; $h{lc $_} } @F[2..$#F]
' file2 file1

结果:

239493     eng     Ice is cold.
383822     eng     Lava is hot.

使用AWK:

awk '
  FNR==NR { a[tolower($1)]++; next }
  { r = $0; for (i=3;i<=NF;i++) { gsub(/\W/,"",$i); if (tolower($i) in a) c++ } }
  c + 2 == NF { print r }
  c = 0
' file2 file1

结果:

239493     eng     Ice is cold.
383822     eng     Lava is hot.