如何在一堆文件中创建所有单词的列表?

How to create a list of all words in a bunch of files?

提问人:Dominique 提问时间:9/18/2023 最后编辑:Dominique 更新时间:9/19/2023 访问量:133

问:

我正在与一位同事打交道,他在整个 C# 解决方案中犯了大量复制/粘贴的拼写错误。

我不想在每个单独的文件上使用拼写检查器,而是想创建整个解决方案中所有单词的列表,在该列表中启动拼写检查器,然后对找到的条目进行完整的“查找和替换”。

为了在文件中找到所有单词,我想到做这样的事情:

grep -wo ".*" blabla.txt

但这似乎行不通:它不是显示每个找到的单词,而是仍然显示找到单词的整行,例如:

this is OK
this is NOK
OK it is
NOK it is
Everything is OK

当我期待这样的事情时:

this
is
OK
this
is
NOK
...

一旦我得到了一个文件的列表,我就可以开始处理并做一些事情来获得单个单词。find ./ -name "*.cs" -exec grep ... {} \; >>output_listsort output_list | uniq

但首先要做的事情是:由于没有向我显示单词,而是显示整行,因此我可以做些什么来使用 UNIX/Linux 命令行显示文件中的所有单词?(我添加了标签,因为这可能是一个解决方案?但我肯定不是巫师:-))grep -ow ".*"awkawk

在第一个答案后编辑:
确实似乎是要走的路。我可能只是使用 ,但有一个问题:我尝试了以下方法,但没有奏效:
trtr ' ' '\n'

find ./ -name "*.cs" -exec cat {} | tr ' ' '\n' >>/mnt/c/Temp_Folder\output.txt \;

该命令给了我一个答案(因为我在某个代码编辑器中),我还做错了什么?>

Linux UNIX AWK 命令行 grep

评论

0赞 DevSolar 9/18/2023
您的意思是“由空格、制表符和换行符分隔的字节序列”,还是根据当前语言环境的实际单词?(后者需要一些大量的Unicode支持......;-)(没有投反对票,只是拉了一下你的腿。

答:

1赞 Ajay 9/18/2023 #1

您可以使用命令:grep

grep -o -E '\S+' blabla.txt | tr ' ' '\n'

现在,您将获得所需的输出:

this
is
OK
this
is
NOK
...

评论

0赞 Dominique 9/18/2023
很近,但也没有雪茄:-)您还能检查一下我的问题的编辑吗?
6赞 anubhava 9/18/2023 #2

如何使用将每个空格/制表符替换为换行符:tr

tr '[[:blank:]]' '\n' <file

this
is
OK
this
is
NOK
OK
it
is
NOK
it
is
Everything
is
OK

根据您编辑的问题,您可以在 shell 中使用此解决方案:find + trbash

while IFS= read -rd '' f; do
   tr ' ' '\n' < "$f"
done < <(find . -name '*.cs' -print0) >/mnt/c/Temp_Folder/output.txt

评论

0赞 Dominique 9/18/2023
接近但不是雪茄:-)你能检查一下我的问题的编辑吗?
0赞 anubhava 9/18/2023
立即查看我更新的答案
1赞 The fourth bird 9/19/2023
你现在可以拿出那盒雪茄了:-)
1赞 ufopilot 9/18/2023 #3

使用 GNU AWK

find ./ -name "*.cs" -print0 | 
    xargs -0 awk -v IGNORECASE=1 '
          { for(i=1; i<=NF; i++) a[$i] } 
          END {
               n=asorti(a,b) 
               for(i=1; i<=n; i++) print b[i]
               print ""
          }
    '  
0赞 Viacheslav Ivannikov 9/18/2023 #4

如果要在文件中包含所有唯一的单词,请使用以下命令:cat input.txt | tr -s ' ' '\n' | sort | uniq

3赞 Ed Morton 9/18/2023 #5

使用 instead 来仅标识单词组成字符而不是任何字符,并使用 instead 来仅查找包含 2 个或更多此类字符的字符串,这样您的输出就不会被单个字符(如 、 等)弄得杂乱无章:\w.{2,}*ai

$ grep -Eow '\w{2,}' file
this
is
OK
this
is
NOK
OK
it
is
NOK
it
is
Everything
is
OK

我建议你也不要试图查找/修改 2 个字母的“单词”,因为它们不太可能是错误的,而且无论如何都很容易理解,并坚持使用 3 个或更多字母的单词:

$ grep -Eow '\w{3,}' file
this
this
NOK
NOK
Everything

当你去替换它们时,创建一个名为这样的文件,将坏词映射到好词:bad2good

tish this
thsi this
ONK NOK

然后使用这个 GNU awk(for 和 word boundaries)脚本:\<\>

awk '
    NR==FNR {
        b2g["\\<" $1 "\\>"] = $2
        next
    }
    {
        for ( bad in b2g ) {
            good = b2g[bad]
            gsub(bad,good)
        }
    }
' bad2good file

保留备份并小心!特别是,请确保在更改后对文件进行人工审查并编译它们,因为这是您正在进行的危险练习。

1赞 Daweo 9/19/2023 #6

我将利用 GNU 来完成这项任务,让内容AWKfile.txt

Able Baker Charlie
Dog Charlie Charlie

然后

awk 'BEGIN{RS="[^[:alpha:]]+"}!arr[$0]++' file.txt

给出输出

Able
Baker
Charlie
Dog

解释:我告诉 GNU 行分隔符 () 是一个或多个非字母字符,然后我使用数组和后递增,所以第一次看到时它是 0,否则是更大的数字,我否定它只打印给定行的第一次出现(在这种情况下是单词)。AWKRSarr

(在 GNU Awk 5.1.0 中测试)