Зациклить слово и извлечь биграм - PullRequest
0 голосов
/ 07 ноября 2019

Я хотел бы извлечь каждый биграмм из данного слова и поместить в текстовый файл.

Например:

apple      -->       ap pp pl le
president  -->       pr re es si id de en nt

Я нашел похожую работу, используя awk и word, но ничегоо словах.

Я только что нашел этот код:

sed 's/\(.\{2\}\)/\1 /g' 

, но он работает с размером окна 2.

Так, например:

apple      -->      ap pl le

Спасибо за помощь

sed 's/\(.\{2\}\)/\1 /g' 

Ожидаемый результат - биграмная строка с размером окна 1.

Ответы [ 6 ]

2 голосов
/ 07 ноября 2019

Я бы сделал это так:

$ sed 's/./&&/g;s/^.//;s/../& /g;s/ .$//' <<< $'president\napple'
pr re es si id de en nt
ap pp pl le

Вот команда sed, разделенная:

s/./&&/g   # Duplicate every character:   "pprreessiiddeenntt"
s/^.//     # Remove first character:      "prreessiiddeenntt"
s/../& /g  # Insert blank between groups: "pr re es si id de en nt t"
s/ .$//    # Remove last two chars:       "pr re es si id de en nt"
1 голос
/ 08 ноября 2019
$ echo 'apple' |
  awk '{n=length($0)-1; for (i=1;i<=n;i++) printf "%s%s", substr($0,i,2), (i<n ? OFS : ORS)}'
ap pp pl le
1 голос
/ 07 ноября 2019

В GNU awk вы можете:

$ echo apple | gawk -F "" '{for(i=1;i<NF;)print $i$(++i)}'       # or use a file
ap
pp
pl
le

Работает также с mawk и Busybox awk, все остальные, вероятно, потерпят неудачу из-за пустого FS (field separator FS is empty)

1 голос
/ 07 ноября 2019

awk может сделать это довольно просто:

$ cat file.txt
 apple
 president
 example
 another

$ awk '{output=""; for(i=1;i<length($0);i++){ output=output" "substr($0,i,2)} print output }' file.txt
 ap pp pl le
 pr re es si id de en nt
 ex xa am mp pl le
 an no ot th he er

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

$ awk '{output="";for(i=1;i<length($0);i++){ output=output" "substr($0,i,2)} print substr(output,2) }' file.txt
ap pp pl le
pr re es si id de en nt
ex xa am mp pl le
an no ot th he er

Все внутри блока { } выполняется для каждой строки, так как к ней не прикреплено никаких условий.

output="" сбрасывает выходную переменную в пустую для каждой строки.

for(i=1;i<length($0);i++){ ... } циклически перебирает строку в каждой строке символ за символом.

output=output" "substr($0,i,2)} print output - этовыполняется внутри вышеуказанного цикла. Для каждого символа строки выходной переменной присваивается ее существующее значение, пробел, затем двухсимвольная подстрока из текущего индекса - проход по каждому символу и печать его и следующего символа.

0 голосов
/ 08 ноября 2019

В командной строке perl:

echo "apple" | perl -nE'say join " ",/(?<=\K.)./g'

Шаблон использует только одну позицию, поскольку одна точка находится внутри области просмотра, но \K дает позицию, из которой возвращается результат совпадения.

0 голосов
/ 07 ноября 2019

дорогой способ

$ echo apple | fold -w1 | awk 'p{print p $0} {p=$0}' | xargs
ap pp pl le
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...