Как нумеровать уникальные слова в каждой отдельной строке, не пропуская абзац?

#python #bash #perl

#python #bash #perl

Вопрос:

Прежде всего я читаю английский язык и программирование, но сейчас я новичок. Итак, я изучил много методов для самостоятельного изучения, но, наконец, я создал личный метод для изучения.
Итак, я собрал много коротких рассказов, читал их изо дня в день. Теперь я использую этот метод как обычно.
Через неделю я начал изучать однострочный язык perl, и это было так полезно для меня.

Тем не менее, я попадаю в perl -pe '$q=0; s/(w )/ Sq." ".$1'
для содержимого:

просто еще

один хакер perl, взламывающий код perl

это стало:

1. просто 2. другой
1.perl 2.хакер
1.взлом 2.perl 3.код

Хорошо, после того, как я увидел этот однострочник perl, у меня появилась идея

Например, я прочитал этот рассказ:

  1. Утром
    он просыпается. Он видит восход солнца. Он чистит зубы. У него белые зубы. Он надевает свою одежду. У него синяя рубашка. Его ботинки желтые. Его штаны коричневые. Он спускается вниз. Он получает миску. Он наливает молоко и хлопья. Он ест. Он достает газету. Он читает.

  2. В первый
    день в школе Он идет на урок. Впереди есть пустое место. Он сидит в кресле. Он оглядывается. Есть разные люди. Он говорит «привет» девушке рядом с ним. Она улыбается. Входит учитель. Она закрывает дверь. Все молчат. Начинается первый день в школе.

  3. Вода на полу
    , Она хочет пить. Она получает стакан воды. Она начинает ходить. Она роняет стакан. На полу вода. Лужа большая. Она получает швабру. Она вытирает воду. Пол чистый. Она получает еще один стакан воды. Она пьет это. Она счастлива.

  4. Няня
    Кейси хочет новую машину. Ей нужны деньги. Она решает посидеть с ребенком. Она заботится о ребенке. Она кормит его обедом. Она читает ему историю. История забавная. Ребенок смеется. Кейси он нравится. Мама ребенка приходит домой. Ребенок целует Кейси. Кейси уходит. Она снова будет нянчиться с ним.

5.
доктор Сэм — доктор. Он заботится о людях. Он улыбается им. Он дает им лекарство. Он раздает стикеры младшим пациентам. Он нравится молодым пациентам. Они видят его, когда болеют. Он заставляет их чувствовать себя лучше. Это делает его счастливым. Он любит свою работу. Он гордится тем, что идет домой.

Как вы можете видеть, это очень просто. Но в начале это нелегко для тех, кто только начал изучать английский.

Итак, моя идея такова. Я хочу, чтобы скрипт был на bash или perl, который, я думаю, perl лучше, этот скрипт может читать много коротких рассказов, которые у меня есть, и для каждой уникальной работы он нумерует слово на месте.

Например, в приведенном выше контексте, который я поставил, я хочу что-то вроде этого:

1.Он 2. просыпается 3.встает. Он 4.видит 5.6.солнце 7.восход. Он 8.чистит 9.его 10.зубы 11.являются 12.белыми Он 13.надевает 14.на него 15.одежда. … и так далее.

Здесь первый Он уникален, поэтому пронумеруйте его до 1.
И до конца содержимого слово «Он» игнорируется, и так далее. Затем скрипт выполняет это для вторых слов, если оно уникально, затем нумерует его, в противном случае игнорирует его.

Также абзац и каждая строка не должны быть пропущены, потому что я распечатываю их на бумаге и читаю ежедневно.

Для завершения этой идеи, чтобы ее могли использовать все остальные, мне нужно иметь базу данных из одного слова, которое анализируется скриптом, чтобы я мог, например, после 100 коротких рассказов, я видел, какое слово я прочитал.
И используйте эту базу данных для игнорирования повторяющегося слова в новом рассказе, который я хочу прочитать.

Зачем я это делаю? Потому что это помогает мне узнать, какое слово я прочитал, а какое слово я не читал. Также это может быть хорошим методом для других, чтобы они могли легко изучать английский язык. пожалуйста, помогите мне развить эту идею, если вы видите что-то плохое в моей идее или если вы знаете подобную идею, подобную этой, которую сделали, пожалуйста, скажите мне.

Таким образом, я хочу, чтобы содержимое, в котором каждое слово было пронумеровано только один раз (один раз)

Извините, ребята, но я хочу распечатать содержимое, не пропуская абзац. Пожалуйста, фотографию

моя домашняя работа

Как вы можете видеть, я должен зачеркнуть новое слово в новом рассказе, чтобы прочитать его в будущем. Скрипт должен напечатать абзац с нумерацией слов, как обычно, чтобы я мог его сохранить, затем я распечатываю его для чтения на бумаге.

Я хочу сделать в этой форме: $ script my_context.txt > new_context.txt

Тогда я могу распечатать его.

Мне очень жаль, если вы видите какую-то ошибку в моем написании. Если вы не понимаете мою идею, пожалуйста, прокомментируйте, чтобы я объяснил ее более подробно.

Большое спасибо!

Комментарии:

1. Какой сценарий у вас есть на данный момент? Вы только задали нам свой вопрос, никакого кода.

2. @not_a_robot это не имеет значения, я знаю эти три, но немного, я хочу, чтобы это работало, может быть, perl лучше для синтаксического анализа текста

Ответ №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.Он 2. просыпается 3.встает. Он 4.видит 5.6.солнце 7.восход. Он 8.чистит 9.его 10.зубы 11.являются 12.белыми Он 13.надевает 14.на него 15.одежда. 16.Его 17.рубашка 18.is 19. синий. Его 20.ботинки 21.желтые. Его 22.брюки 23.коричневые. Он 24.идет 25.вниз. Он 26.получает 27.28.чаша. Он 29.наливает 30.некоторые 31.молоко 32.и 33.хлопья. Он 34.ест. Он получает 35.газета. Он 36.читает.

вы также можете сделать это без учета регистра, изменив ключ, как я сделал для фильтрации не алфавитных символов.

Комментарии:

1. Спасибо, что это работает, но поместите дополнительную новую строку в начало первой строки. Сначала выведите 1. затем новую строку, затем другое содержимое.

2. Я использовал ваш входной файл и создал это. Вы тестировали с другим входным файлом?

3. Хорошо сделано, это работает, но что я могу сделать для создания базы данных в будущем? Потому что у меня есть более 1000 коротких рассказов, которые я хочу прочитать. Мне нужна база данных старого слова, которое я прочитал, чтобы пропустить в новом контенте.

4. 1000 файлов находятся в пределах досягаемости этого скрипта. Если вы хотите делать это постепенно, возможно, имеет смысл иметь постоянные данные для нумерации. Однако это может быть простой текстовый файл, хранящий word -> index сопоставление.

Ответ №2:

 #!/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.
  

ДЕМОНСТРАЦИЯ

Комментарии:

1. Спасибо, но это разрушает абзац, поэтому я не могу его распечатать

Ответ №3:

 $ 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 видит 5 восход солнца 6 7. Он 8 чистит 9, его 10 зубов 11 12 белые, Он 13 надевает 14 на свою одежду 15. Его рубашка 16 17 18 синего цвета. Его 19 ботинок — 20 желтых. Его 21 штаны 22 коричневые. Он 23 идет 24 вниз. Он 25 получает 26 из 27 чаш. Он 28 наливает 29 молока 30, 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
  

Комментарии:

1. Я протестировал его на 2 разных блоках с 2 разными версиями Gnu awk, mawk и original-awk, и он работает со всеми из них. Вы используете последнюю версию моего скрипта, верно?

2. Я новичок, но не такой. Я сделал ваш код шаг за шагом. Я не знаю, может быть, у моего Ubuntu или awk или у чего-то еще есть проблема.

Ответ №4:

Быстрое и очень грязное решение на 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.'