我正在为一个天真的布尔信息检索系统做更快的测试,我想使用awk,grep,egrep,sed或类似的东西和管道将文本文件拆分成单词并将它们保存到其他文件中每行字。示例我的文件cotains:
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
...
感谢!
答案 0 :(得分:46)
使用tr:
tr -s '[[:punct:][:space:]]' '\n' < file
答案 1 :(得分:7)
最简单的工具是fmt:
fmt -1 <your-file
fmt旨在打破行以适应指定的宽度,如果提供-1
,它会在单词后面立即中断。有关文档,请参阅man fmt
。灵感来自http://everythingsysadmin.com/2012/09/unorthodoxunix.html
答案 2 :(得分:3)
使用sed
:
$ sed -e 's/[[:punct:]]*//g;s/[[:space:]]\+/\n/g' < inputfile
基本上这会删除所有标点符号并用换行符替换任何空格。这也假设您的sed
了解\n
。有些则没有 - 在这种情况下,您可以使用文字换行(即将其嵌入引号内)。
答案 3 :(得分:2)
grep -o
仅打印匹配模式
grep -o '[[:alpha:]]*' file
答案 4 :(得分:1)
cat input.txt | tr -d ",." | tr " \t" "\n" | grep -e "^$" -v
tr -d“,.”删除“,”和“。”
tr“\ t”“\ n”将空格和制表符更改为换行符
grep -e“^ $” - v删除空行(如果是两个或多个空格)
答案 5 :(得分:1)
awk 'BEGIN{FS="[[:punct:] ]*";OFS="\n"}{$1=$1}1' inputfile
答案 6 :(得分:1)
根据你到目前为止的回答,我认为你可能正在寻找的是将单词视为由空格,逗号,句子结尾字符分隔的字符序列(即“。”“!”或“?”in English )和其他通常不会与字母数字字符结合使用的字符(例如“&lt;”和“;”但不是'
-
#
$
{ {1}})。现在,“。”是一个句子结束字符但您说%
应该被视为“单词”,因此$27.00
需要根据上下文区别对待。我认为“ - ”可能也是如此,也许还有其他一些角色。
所以你需要一个可以转换它的解决方案:
.
进入这个:
I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "foo@bar.com".
这是对的吗?
尝试使用GNU awk,这样我们就可以将RS设置为多个字符:
I
have
$27.00
We're
20%
under-budget
right
This
is
#2
mail
me
at
foo@bar.com
尝试提出一些其他测试用例,看看它是否总能满足您的需求。
答案 7 :(得分:0)
首先是一个非常简单的选择,
sed 's,\(\w*\),\1\n,g' file
要注意它既不处理撇号也不处理标点符号
答案 8 :(得分:0)
使用perl
:
perl -ne 'print join("\n", split)' < file
答案 9 :(得分:0)
使用perl:
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
答案 10 :(得分:0)
perl -ne'print join(“\ n”,split)'
抱歉@jsageryd
一个班轮没有给出正确的答案,因为它将最后一个单词加到下一个第一个单词上。
这是更好的但是为src中的每个空行生成一个空行。管道通过| sed'/ ^ $ / d'来修复
perl -ne'{print join(“\ n”,split(/ [[:^ word:]] + /)),“\ n”; ''