我想改变:
e·ver·y·bo·dy
到:
e·ver·y·bo·dy
e·ver·y·bo·
e·ver·y·
e·ver·
e·
for
更优选循环。
答案1
这也使用了for
循环,尽管是 awkfor
循环:
$ echo "e·ver·y·bo·dy" | awk -F· -v OFS=· '{print;for (i=NF;i>1;i--){$i="";print;NF--} }'
e·ver·y·bo·dy
e·ver·y·bo·
e·ver·y·
e·ver·
e·
从短到长的替代版本
$ echo 'e·ver·y·bo·dy' | awk -F· -v OFS=· '{for (i=1;i<=NF;i++){for (j=1;j<=i;j++)printf "%s%s",$j,j<NF?OFS:"";print""} }'
e·
e·ver·
e·ver·y·
e·ver·y·bo·
e·ver·y·bo·dy
另一种变化
$ echo 'e·ver·y·bo·dy' | awk -F· -v OFS=· '{s="";for (i=1;i<=NF;i++){s=s OFS $i; printf "%s",substr(s,2); print (i==NF)?"":OFS} }'
e·
e·ver·
e·ver·y·
e·ver·y·bo·
e·ver·y·bo·dy
答案2
你可以通过更短的方式做到这一点awk命令如下(长到小):
$ awk -F'·' '{while (NF){ print $0;NF--;ORS="·\n"}}' OFS='·' file
e·ver·y·bo·dy
e·ver·y·bo·
e·ver·y·
e·ver·
e·
来自小到长如下:
$ awk -F'·' '{i=1; while(i<NF){ print tmp=tmp$((i++))"·"} print $0}' file
e·
e·ver·
e·ver·y·
e·ver·y·bo·
e·ver·y·bo·dy
答案3
如果它必须是一个for
循环:
IFS=·
for l in $(echo "e·ver·y·bo·dy"); do x="$x$l·"; echo "$x"; done | tac
首先我们必须设置内部文件分隔符到·
。然后 for 循环遍历每个部分并打印,但顺序不对。这就是为什么tac
最后要反转顺序。
给我输出:
e·ver·y·bo·dy·
e·ver·y·bo·
e·ver·y·
e·ver·
e·
答案4
这是一个python
解决方案:
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
input_str = 'e·ver·y·bo·dy'
input_list = input_str.split('·')
print input_str
i = len(input_list)
while i > 1:
print '·'.join(input_list[:i-1]) + '·'
i -= 1
这里我们首先split
使用输入字符串·
作为分隔符来生成一个列表,然后使用列表切片join
来得到所需的输出。