因此,我有一个包含随机文本的文本文件,我需要列出该文件中存在的所有单词,但过滤我的停用词文件中常见的所有单词。我可以使用什么命令来实现此目的?
答案1
假设“单词”是一个被空格包围的字符串,您可以将所有空格更改为换行符,对结果进行排序并删除重复项。然后只需从该列表中删除停用词即可。
tr -s '[:space:]' '[\n*]' <textfile |
sort -fu |
grep -v -Fix -f stopwords
该tr
命令将所有类似空格的字符更改为换行符,并将多个连续的换行符压缩为一个。然后对每行一个单词的列表进行排序,并删除重复的单词(忽略带 的大小写-f
)。
您还可以尝试'[:space:][:punct:]'
作为第一个参数,tr
将文本拆分为类似空格的字符和标点符号上的单词,或者使用明确的字符列表,例如' ,.!?'
.
然后将排序后的唯一单词列表与stopwords
(包含每行一个停止词的行的文件;更改为您拥有的任何文件)中的单词进行比较,并且保留该列表中不匹配的单词。
-F
强制实用程序grep
将模式视为字符串而不是作为正则表达式。该-i
选项使其使用不区分大小写的匹配。该-x
选项让我们只接受全行匹配(而不是子字符串匹配)。该-v
选项反转了通常的匹配含义,因此线不是匹配被保留,并从指定文件中读取模式-f
。grep
答案2
如果不知道这两个文件是什么样的,就很难回答你的问题。
但这条单线应该可以解决问题:
comm -3 <(sed 's/\s\+/\n/g' random.txt | sort | uniq) <(sed 's/\s\+/\n/g' stopwords.txt | sort | uniq)
comm -3
将逐行比较两个排序的文件并抑制两个文件中出现的行。
<(...)
是一个 bash 技巧,它将一个命令的输出作为文件呈现给另一个命令。所以我在这里所做的是从两个文件中生成一个排序的单词列表:
sed 's/\s\+/\n/g' random.txt
将所有空格和制表符转换为换行符。伟大的!每行一个字。
sort
就是这样做并对这些行进行排序。
uniq
确保每个单词只出现一次。
或者你可以使用tr
而不是sed
:
comm -3 <(tr -s '[:space:]' '\n' < random.txt | sort | uniq) <(tr -s '[:space:]' '\n' < stopwords.txt | sort | uniq)
如果您有非常大的文件,这可能会更快。
答案3
由于您没有提供任何示例输入/输出,因此做出了一系列假设 - 使用 GNU awk 进行多字符 RS:
awk -v RS='[^[:alpha:]]*[[:space:]]+[^[:alpha:]]*' '
{lc=tolower($0)} NR==FNR{a[lc]++; next} !a[lc]++
' stop_words random_text
例如使用此输入:
$ head stop_words random_text
==> stop_words <==
a Of in at As
The by I on
==> random_text <==
I wandered lonely as a cloud
That floats on high o'er vales and hills,
When all at once I saw a crowd,
A host, of golden daffodils;
I wandered lonely as a cloud
When all at once I saw a crowd,
$ awk -v RS='[^[:alpha:]]*[[:space:]]+[^[:alpha:]]*' '{lc=tolower($0)} NR==FNR{a[lc]++; next} !a[lc]++' stop_words random_text
wandered
lonely
cloud
That
floats
high
o'er
vales
and
hills
When
all
once
saw
crowd
host
golden
daffodils