Unix 循环单词并提取二元图

Unix 循环单词并提取二元图,unix,awk,sed,text-processing,Unix,Awk,Sed,Text Processing,我想从一个给定的单词中提取每一个双字符并放入一个文本文件中 例如: apple --> ap pp pl le president --> pr re es si id de en nt apple --> ap pl le 我发现类似的工作使用awk和word,但没有关于单词 我刚刚发现了以下代码: sed 's/\(.\{2\}\)/\1 /g' 但它的窗口大小为2 例如: apple -->

我想从一个给定的单词中提取每一个双字符并放入一个文本文件中

例如:

apple      -->       ap pp pl le
president  -->       pr re es si id de en nt
apple      -->      ap pl le
我发现类似的工作使用awk和word,但没有关于单词

我刚刚发现了以下代码:

sed 's/\(.\{2\}\)/\1 /g' 
但它的窗口大小为2

例如:

apple      -->       ap pp pl le
president  -->       pr re es si id de en nt
apple      -->      ap pl le
谢谢你的帮助

sed 's/\(.\{2\}\)/\1 /g' 
预期结果是一个窗口大小为1的二进制字符串。

我会这样做:

$ sed 's/./&&/g;s/^.//;s/../& /g;s/ .$//' <<< $'president\napple'
pr re es si id de en nt
ap pp pl le
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=将每行的输出变量重置为空

fori=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字段分隔符为空,所有其他的可能都会失败。FS为空是一种昂贵的方法

$ echo apple | fold -w1 | awk 'p{print p $0} {p=$0}' | xargs
ap pp pl le

使用perl命令行:

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

模式只使用一个位置,因为一个点位于lookback中,但是\K给出了返回匹配结果的位置。

@karakfa/2g是特定于实现的,适用于GNU-sed,但不一定在其他地方,所以我不想使用它,但另一个我可以裁剪的命令很好。它应该如何处理像a这样的单字符输入?如果单词包含特殊字符会发生什么?例如,应用程序le?结果应该始终是:ap pp p--l le
$ 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