我是bash的新手。我有两个单词列表文件,如下所示。
文件1(搜索词的单词列表)
foo
bar
file2(包含大量单词组合的单词列表)
beforefoo
fooafter
beforefooafter
bar
我想制作一个结果文件,其中包含来自 file1 的搜索词和来自文件 2 的所有单词,其中包含搜索词,例如:
foo beforefoo fooafter beforefooafter
bar bar
我需要一个 bash 脚本来执行此操作。File1 和 file2 每行只包含一个单词,file1 的行数约为 50.000,file2 约为 100.000.000,所以我需要一个好的脚本来尽快完成此操作。
感谢您的回答。
使用 awk:
awk 'FNR==NR{a[$1]; next}
{s=$1; for (i in a) if (index(i, $1)) s=s FS i; if (s!=$1) print s}' file2 file1
foo fooafter beforefoo beforefooafter
bar bar
使用 awk
awk 'NR==FNR{a[$1]=$1;next}
{ for (i in a) if ($0~i) a[i]=a[i] FS $0}
END{for (i in a) print a[i]}' file1 file2
解释
-
NR==FNR{a[$1]=$1;next}
将第一个文件读入关联数组a
-
for (i in a) if ($0~i) a[i]=a[i] FS $0}
,如果列 #1 是a
的索引,则将第二个文件的内容附加到a
中。 -
END{for (i in a) print a[i]
打印数组的结果
使用 $1 - 是因为 OP 每行都提到了一个单词,但也许这些单词前后都有一些空格,所以使用 $1,它会更准确。