llo*_*wen 12 scripting sed awk text-processing
我有一个文本文档,其中包含大量文本,每个字母后都添加了一个额外的空格!
例子:
T h e b o o k a l s o h a s a n a n a l y t i c a l p u r p o s e w h i c h i s m o r e i m p o r t a n t…
Run Code Online (Sandbox Code Playgroud)
视觉上:
T␣h␣e␣␣b␣o␣o␣k␣␣a?l?s?o??h?a?s??a?n??a?n?a?l?y?t?i ?c?a?l??p?u?r?p?o?s?e??w?h?i?c?h??i?s??m?o?r?e??i? m?p?o?r?t?a?n?t…
请注意,每个字母后面都有一个额外的空格,因此连续单词之间有两个空格。
有没有办法获得awk或sed删除多余的空格?(不幸的是,这个文本文档很大,需要很长时间手动完成。)
我很欣赏这可能是一个更复杂的问题,只需一个简单的 bash 脚本即可解决,因为还需要某种文本识别。
我该如何解决这个问题?
小智 18
使用wordsegment纯Python分词NLP包:
$ pip install wordsegment
$ python2.7 -m wordsegment <<<"T h e b o o k a l s o h a s a n a n a l y t i c a l p u r p o s e w h i c h i s m o r e i m p o r t a n t"
the book also has an analytical purpose which is more important
Run Code Online (Sandbox Code Playgroud)
Dew*_*gan 16
以下正则表达式将删除任何空格字符串中的第一个空格。那应该可以完成这项工作。
s/ ( *)/\1/g
Run Code Online (Sandbox Code Playgroud)
所以像:
perl -i -pe 's/ ( *)/\1/g' infile.txt
Run Code Online (Sandbox Code Playgroud)
...将用“固定”版本替换 infile.txt。
Jul*_*ier 13
基于输入包含单词之间的双空格这一事实,有一个更简单的解决方案。您只需将双空格更改为未使用的字符,删除空格并将未使用的字符更改回空格:
echo "T h e b o o k a l s o h a s a n a n a l y t i c a l p u r p o s e w h i c h i s m o r e i m p o r t a n t " | sed 's/ /\-/g;s/ //g;s/\-/ /g'
Run Code Online (Sandbox Code Playgroud)
...输出:
这本书还有一个更重要的分析目的
cho*_*oba 10
Perl 来救援!
您需要一本字典,即每行列出一个单词的文件。在我的系统上,它作为 存在/var/lib/dict/words,我也看到过类似的文件/usr/share/dict/british等。
首先,你记住字典中的所有单词。然后,您逐行阅读输入,并尝试向单词添加字符。如果可能,您记住这个词并尝试分析该行的其余部分。如果到达行尾,则输出该行。
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
my $words = '/var/lib/dict/words';
my %word;
sub analyze {
my ($chars, $words, $pos) = @_;
if ($pos == @$chars) {
$_[3] = 1; # Found.
say "@$words";
return
}
for my $to ($pos .. $#$chars) {
my $try = join q(), @$chars[ $pos .. $to ];
if (exists $word{$try}) {
analyze($chars, [ @$words, $try ], $to + 1, $_[3]);
}
}
}
open my $WORDS, '<', $words or die $!;
undef @word{ map { chomp; lc $_ } <$WORDS> };
while (<>) {
my @chars = map lc, /\S/g;
analyze(\@chars, [], 0, my $found = 0);
warn "Unknown: $_" unless $found;
}
Run Code Online (Sandbox Code Playgroud)
对于您的输入,它会在我的系统上生成 4092 个可能的读数。
注意:此答案(与此处的其他一些答案一样)基于该问题的早期版本,其中未对单词进行分隔。较新的版本可以轻松回答。
在像这样的输入上:
T h e b o o k a l s o h a s a n a n a l y t i c a l p u r p o s e w h i c h i s m o r e i m p o r t a n t
你可以试试:
$ tr -d ' ' < file | grep -oiFf /usr/share/dict/words | paste -sd ' '
The book also has ana na l y tic al purpose which ism ore important
Run Code Online (Sandbox Code Playgroud)
它从左到右处理并在下一个之后找到一个最长的单词。
显然,在这里,这不是最好的单词选择,因为该句子没有任何意义,但是要提出正确的单词,您需要能够理解文本语法或含义的工具,或者至少需要一些统计数据有关哪些词可能被一起找到以提出最可能的词集的信息。看起来解决方案是Lynn 发现的专门库