0

我想从给定的单词中提取每一个二元组并放入一个文本文件中。

例如:

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

我使用 awk 和 word 找到了类似的工作,但没有关于 word 的内容。

我刚刚找到了这段代码:

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

但它的窗口大小为 2。

因此,例如:

apple      -->      ap pl le

感谢帮助

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

预期的结果是一个窗口大小为 1 的二元串。

4

6 回答 6

2

我会这样做:

$ 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"
于 2019-11-07T19:35:11.157 回答
1
$ 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
于 2019-11-08T00:14:15.643 回答
1

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- 这是在上述循环中执行的。对于字符串的每个字符,输出变量被分配给它的现有值,一个空格,然后是当前索引中的两个字符子字符串 - 遍历每个字符并打印它和下一个字符。

于 2019-11-07T19:36:28.990 回答
1

使用 perl 命令行:

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

模式只消耗一个位置,因为一个点位于后视内,但\K给出了返回匹配结果的位置。

于 2019-11-07T21:00:02.793 回答
1

在 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)而失败

于 2019-11-07T20:04:28.293 回答
0

昂贵的方式

$ echo apple | fold -w1 | awk 'p{print p $0} {p=$0}' | xargs
ap pp pl le
于 2019-11-07T20:06:21.197 回答