如何在每一行中对唯一单词进行编号,而不是错过段落?

时间:2016-09-30 12:47:43

标签: python bash perl

之前我正在阅读英语和编程,但我现在是初学者。所以我做了很多方法来学习EN(自学),但最后我做了个人学习的方法 所以我收集了很多短篇小说然后,日复一日地阅读这些。现在我像往常一样做这个方法 一个星期,我开始学习 perl one-liner ,这对我来说非常有用。

但是,我进入了perl -pe '$q=0; s/(\w+)/++Sq." ".$1' 内容:

  

只是另一个   perl hacker
  黑客攻击代码

它成为:

  

1.just 2.another
  1.perl 2.hacker
  1.hacking 2.perl 3.code

好的,在我看到 perl one-liner 后,我有了一个主意

例如,我读了这篇短篇小说:

  
      
  1. 上午
      他醒来。他看到太阳升起了。他刷牙了。他的牙齿是白色的。他穿上他的衣服。他的衬衫是蓝色的。他的   鞋子是黄色的。他的裤子是棕色的。他下楼去了。他得到了一个   碗。他倒了牛奶和麦片。他吃。他得到了报纸。他   读取。

  2.   
  3. 首先
      上学日他去上课。前面有一个空座位。他坐在座位上。他环顾四周。有不同的   人。他对旁边的女孩说“嗨”。她笑了。老师   进来了。她关上了门。每个人都沉默。第一天   学校开始了。

  4.   
  5. 地板上的水
      她渴了。她喝了一杯水。她开始走路了。她放下玻璃杯。地板上有水。该   水坑很大。她得到一个拖把。她把水擦掉了。地板是   清洁。她又喝了一杯水。她喝了。她很高兴。

  6.   
  7. 婴儿
      凯西想要一辆新车。她需要钱。她决定照看孩子。她照顾孩子。她喂他吃午饭。她阅读   他是个故事。这个故事很有趣。孩子笑了。凯西喜欢他。   孩子的妈妈回家了。孩子亲吻凯西。凯西离开了。她   会再照顾他。

  8.         

    5.a docter
      山姆是一名医生。他照顾人。他对他们微笑。他给了他们药。他给年轻人贴纸   耐心。年轻的病人喜欢他。他们看到他们的时候   生病。他让他们感觉更好。这让他很开心。他爱他   工作。他自豪地回家了。

如您所见,这很容易。但一开始,对刚刚开始学习英语的人来说并不容易。

所以我的想法是这样的。我希望脚本可能在 bash perl ,我认为 perl 更好,该脚本可以读取很多短 - 我拥有的故事,对于每个独特的作品,它都会在这个地方编号。

例如在上面提到的上下文中,我想要这样的东西:

  

1.He 2.wakes 3.up。他4.sees 5.the 6.sun 7.rise。他8.在他的衣服上穿上了他的衣服。 ......等等。

这里第一个是唯一的,所以将它编号为1 直到内容结束时,“He”字被忽略,依此类推。 然后脚本对第二个单词执行此操作,如果它是唯一的,则对其进行编号,否则忽略它。

段落和每行一定不能错过,因为我用纸张打印并每天阅读。

为了完成这个想法以供其他人使用我需要从一个单词中获得一个数据库来解析脚本,以便我可以在之后,例如100个短篇小说,我看到单词I已阅读。
并使用此数据库来忽略我想要阅读的新短篇小说中的重复单词。

为什么我这样做?因为这有助于我知道我读过的单词和我没有读过的单词。对于其他人来说,这可能是一个很好的方法,因此他们可以轻松地学习英语。请帮助我发展这个想法如果你在我的想法中看到一些不好的东西,或者如果你知道类似的想法,那就完成了,请告诉我。

总之,我想要一个内容,每个单词只有一次(一次)编号

很抱歉伙计们,但我想打印内容而不会错过这段话。请照片

my homework

正如您所看到的,我必须在新的短篇小说中翻阅新单词,以便将来阅读。脚本必须像往常一样用编号字打印段落,这样我就可以保存它,然后打印出来在纸上阅读。

我想以这种形式做: $ script my_context.txt > new_context.txt

然后我可以打印出来。

如果你在写作中看到一些错误,我很抱歉。如果您不理解我的想法请发表评论,以便我更详细地解释它。

非常感谢!

4 个答案:

答案 0 :(得分:1)

#!/usr/bin/perl
use strict;
use warnings;
my @words = <DATA> =~ /(\w+)/g;
my %seen;
my $count = 1;
foreach my $value (@words) {
  if ( !$seen{$value} ) {
    print "$count.$value ";
    $seen{$value} = 1;
  }
  else{
    print "$value";
  }
  $count++;
}
__DATA__
He wakes up. He sees the sun rise. He brushes his teeth are white He puts on his clothes. His shirt is blue. His shoes are yellow. His pants are brown. He goes downstairs. He gets a bowl. He pours some milk and cereal. He eats. He gets the newspaper. He reads.

<强> Demo

答案 1 :(得分:1)

awk救援!

$ awk -v RS=" +" -v ORS=" " '{key=$0;gsub(/[^A-Za-z]/,"",key); 
                              if(key in a)print $0;
                              else{a[key];print ++c"."$0}}' file
  

1.He 2.wakes 3.up。他4.sees 5.the 6.sun 7.rise。他8.在他的衣服上穿上了他的衣服。 16.His 17.shirt 18.is 19.blue。他的20.shoes是21.yellow。他的22.pants是23.brown。他24.goes 25.downstairs。他26.在27.a 28.bowl。他29.pours 30.some 31.milk 32.and 33.cereal。他34岁了。他得到了35.newspaper。他36.reads。

你也可以通过更改密钥来区分非区分大小写,就像我过滤非字母字符一样。

答案 2 :(得分:1)

$ cat script.txt 
BEGIN {RS=" "; ORS=" "}       # the record is a word
{
    key=$0                    # separate key to clean it up
    gsub(/[^a-zA-Z]/,"",key)  # remove ".," etc.
    key=tolower(key)          # and capitals
    if(!(key in a)) {         # if not seen before
        print ++i; a[key]     # print the running number
    }
} 1                           # and the word

运行它:

$ awk -f script.awk short_story_in_2_paragraphs.txt
  

1他2醒来3。他4看到6个太阳7升了5。他8个刷子9他的10个牙齿11个是12个白色他13个穿着他的15件衣服。他的16件衬衫17是18蓝色。他的19双鞋是20黄色。他的21条裤子是22棕色。他23楼24楼。他25得到26碗27碗。他28倒了29个牛奶31和32个谷物。他33吃。他收到了34份报纸。他35读。

     他醒了。他看到太阳升起了。他刷牙是白色的,他穿上了衣服。他的衬衫是蓝色的。他的鞋子是黄色的。他的裤子是棕色的。他下楼去了。他拿了一个碗。他倒了一些牛奶和麦片。他吃。他得到了报纸。他36读。

我不明白最后一个号码36 reads,你:D。

版本2(.1:)

BEGIN {RS=" "; ORS=" "}              # the record is a word
NR==FNR {a[$0]; next}                # read the database of words into memory
{
    key=$0                           # separate key to clean it up
    gsub(/[^a-zA-Z]/,"",key)         # remove ".," etc.
    key=tolower(key)                 # and capitals
    if(!(key in a)) {                # if not seen before
        print ++i; a[key]            # print the running number
        print key >> "database.txt"  # append word to database
    }
} 1                                  # and the word

运行它:

$ awk -f script2.awk database.txt story.txt

预计database.txt存在且至少包含一个字:

$ echo -n a\  > database.txt

答案 3 :(得分:0)

Python中一个快速且非常脏的解决方案......

story = 'He wakes up. He sees the sun rise. He brushes his teeth are white He puts on his clothes. His shirt is blue. His shoes are yellow. His pants are brown. He goes downstairs. He gets a bowl. He pours some milk and cereal. He eats. He gets the newspaper. He reads.'

already_seen = set()
count = 0
my_story_string = ''
for word in story.split():
    if word not in already_seen:
        count += 1
        res = " ".join([str(count), word])
        print(word_number_tuple)
        already_seen.add(word)
    else:
        res = word
        print(word)
    my_story_string += ' ' + res

>>> my_story_string
' 1 He 2 wakes 3 up. He 4 sees 5 the 6 sun 7 rise. He 8 brushes 9 his 10 teeth 11 are 12 white He 13 puts 14 on his 15 clothes. 16 His 17 shirt 18 is 19 blue. His 20 shoes are 21 yellow. His 22 pants are 23 brown. He 24 goes 25 downstairs. He 26 gets 27 a 28 bowl. He 29 pours 30 some 31 milk 32 and 33 cereal. He 34 eats. He gets the 35 newspaper. He 36 reads.'