如何在unix命令行中分割文件?

时间:2013-03-19 14:03:19

标签: unix command-line awk tokenize

我正在为一个天真的布尔信息检索系统做更快的测试,我想使用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
...

感谢!

11 个答案:

答案 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系列也可以用吗?

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 -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”; ''