28

我正在对一个简单的布尔信息检索系统进行更快的测试,我想使用 awk、grep、egrep、sed 或类似的东西和管道将文本文件拆分为单词并将它们保存到其他文件中,每行一个单词. 示例我的文件包含:

Hola mundo, hablo español y no sé si escribí bien la
pregunta, ojalá me puedan entender y ayudar
Adiós.

输出文件应包含:

Hola
mundo
hablo
español
...

谢谢!

4

11 回答 11

55

使用 tr:

tr -s '[[:punct:][:space:]]' '\n' < file
于 2013-03-19T14:13:10.230 回答
13

最简单的工具是 fmt:

fmt -1 <your-file

fmt 旨在换行以适应指定的宽度,如果您提供-1它,则在单词之后立即换行。请参阅man fmt文档。灵感来自http://everythingsysadmin.com/2012/09/unorthodoxunix.html

于 2017-02-01T11:44:10.047 回答
4

使用sed

$ sed -e 's/[[:punct:]]*//g;s/[[:space:]]\+/\n/g' < inputfile

基本上这会删除所有标点符号并用换行符替换任何空格。这也假设你sed理解的味道\n。有些没有——在这种情况下,您可以只使用文字换行符(即通过将其嵌入引号中)。

于 2013-03-19T14:06:56.007 回答
3

grep -o仅打印与模式匹配的匹配行的部分

grep -o '[[:alpha:]]*' file
于 2013-03-19T14:19:26.467 回答
1

使用perl

perl -ne 'print join("\n", split)' < file

于 2013-03-19T14:07:38.897 回答
1
cat input.txt | tr -d ",." | tr " \t" "\n" | grep -e "^$" -v

tr -d ",."删除,.

tr " \t" "\n"将空格和制表符更改为换行符

grep -e "^$" -v删除空行(如果有两个或更多空格)

于 2013-03-19T14:12:07.260 回答
1

这条 awk 线也可以工作吗?

awk 'BEGIN{FS="[[:punct:] ]*";OFS="\n"}{$1=$1}1'  inputfile
于 2013-03-19T14:16:23.343 回答
1

根据您迄今为止的回答,我认为您可能正在寻找的是将单词视为由空格、逗号、句尾字符(即英语中的“.”“!”或“?”)和其他字符分隔的字符序列。您通常不会与字母数字字符组合找到的字符(例如“<”和“;”但不是' - # $ %)。现在, ”。” 是一个句子结尾字符,但您说它$27.00应该被视为一个“单词”,因此.需要根据上下文进行不同的处理。我认为“-”和其他一些字符可能也是如此。

因此,您需要一个可以将其转换的解决方案:

I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "foo@bar.com".

进入这个:

I
have
$27.00
We're
20%
under-budget
right
This
is
#2
mail
me
at 
foo@bar.com

那是对的吗?

使用 GNU awk 试试这个,这样我们就可以将 RS 设置为多个字符:

$ cat file
I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "foo@bar.com".

$ gawk -v RS="[[:space:]?!]+" '{gsub(/^[^[:alnum:]$#]+|[^[:alnum:]%]+$/,"")} $0!=""' file
I
have
$27.00
We're
20%
under-budget
right
This
is
#2
mail
me
at
foo@bar.com

尝试提出其他一些测试用例,看看这是否总是符合您的要求。

于 2013-03-19T16:56:05.633 回答
0

首先是一个非常简单的选择,

sed 's,\(\w*\),\1\n,g' file

注意它既不处理撇号也不处理标点符号

于 2013-03-19T14:07:07.517 回答
0

使用

perl -pe 's/(?:\p{Punct}|\s+)+/\n/g' file

输出

Hola
mundo
hablo
español
y
no
sé
si
escribí
bien
la
pregunta
ojal�
me
puedan
entender
y
ayudar
Adiós
于 2013-03-19T14:13:40.500 回答
0

perl -ne '打印连接(“\n”,拆分)'

对不起@jsageryd

那个衬线没有给出正确的答案,因为它将最后一个单词与下一个单词连接在一起。

这样更好,但会为 src 中的每个空行生成一个空行。管道通过 | sed '/^$/d' 来解决这个问题

perl -ne '{ print join("\n",split(/[[:^word:]]+/)),"\n"; }'

于 2014-10-17T12:05:30.453 回答