LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 8847|回复: 13

考考你:如何横排变竖排?

[复制链接]
发表于 2003-9-25 16:02:14 | 显示全部楼层 |阅读模式
像中国的诗歌,如:
大雪压青松
青松挺且直
要知松格在
待到雪化时
如何变成竖版:
待要青大
到知松雪
雪松挺压
化格且青
时在直松
?
发表于 2003-9-25 18:19:45 | 显示全部楼层
考不考虑中英文混排?
不考虑。。很简单
考虑。。现在我还不会
发表于 2003-9-25 19:08:41 | 显示全部楼层

抛砖引玉..

[php]
#!/bin/bash

if [[ $1 == "" ]]; then
  echo usage: trans.sh filename;
  exit 1;
fi

declare -a str;
let i=1;

while read poem
do
   str=$poem;
   let i=i+1;
done < $1;

let len=${#str[1]};

for ((k=0;k<=len;k=k+2))
do
  echo
  for (( j=i-1; j>=1; j-- ))
   do
    echo -n  ${str[j]:k:2}
   done
done
[/php]
$ ./trans.sh poem1.txt

足老乐玳瞿金女梨风五公先感与妙临晚绛罢来矫霍天观一昔
茧夫极筵塘粟乐园尘十孙帝时余舞颍有唇如如如如地者舞有
荒不哀急石堆余子鸿年剑侍抚问此美弟珠江雷群羿为如剑佳
山知来管城前姿弟洞间器女事答曲人子袖海霆帝射之山器人
转其月曲草木映散昏似初八增既神在传两凝收骖九久色动公
愁所东复萧已寒如王反第千惋有扬白芬寂清震龙日低沮四孙
疾往出终瑟拱日烟室掌一人伤以扬帝芳寞光怒翔落昂丧方氏
。,。,。,。,。,。,。,。,。,。,。,。,。,
 楼主| 发表于 2003-9-25 20:35:03 | 显示全部楼层
最初由 penny 发表
考不考虑中英文混排?
不考虑。。很简单
考虑。。现在我还不会


我也觉得如果是单纯的对仗的诗句是没什么问题的,如果考虑标点符号,还所有中英文等等的因素,呵呵~~,恐怕shell就无能为力啦~~,
我想的比较丑陋

花间一壶酒,独酌无相依.
举杯邀明月,对影成三人.
月既不解饮,影徒随我身.
暂伴月将影,行乐须及春.
我歌月徘徊,我舞影零乱.
醒时同交欢,醉后各分散.
永结无情游,相期藐云汉.
[php]
#!/bin/ksh
#name:ss
n=1
cont=$(cat $1|sed -n 1p|wc -c)
while ((n<=$cont))
do
tac $1|sed 's/\,/aa/g'|tr -d ' '|cut -c$n-$((n+1))|tr -d '\n'
((n+=2));echo "\n"
done|tr -s '\n'|sed 's/\./&\ /g'|sed 's/aa/, /g'
[/php]
永醒我暂月举花
结时歌伴既杯间
无同月月不邀一
情交徘将解明壶
游欢徊影饮月酒
, , , , , , ,
相醉我行影对独
期后舞乐徒影酌
藐各影须随成无
云分零及我三相
汉散乱春身人依
. . . . . . .

用我的脚本给penny兄的恢复一下 ;)
[/home/javalee/myshell]ksh ss sg|rev|tac
昔有佳人公孙氏,
一舞剑器动四方。
观者如山色沮丧,
天地为之久低昂。
霍如羿射九日落,
矫如群帝骖龙翔。
来如雷霆收震怒,
罢如江海凝清光。
绛唇珠袖两寂寞,
晚有弟子传芬芳。
临颍美人在白帝,
妙舞此曲神扬扬。
与余问答既有以,
感时抚事增惋伤。
先帝侍女八千人,
公孙剑器初第一。
五十年间似反掌,
风尘鸿洞昏王室。
梨园子弟散如烟,
女乐余姿映寒日。
金粟堆前木已拱,
瞿塘石城草萧瑟。
玳筵急管曲复终,
乐极哀来月东出。
老夫不知其所往,
足茧荒山转愁疾。
 楼主| 发表于 2003-9-26 20:11:54 | 显示全部楼层
原文:
  1. [/home/javalee/myshell]cat song
  2. 常常责怪自己 当初不应该
  3. 常常後悔没有把你留下来
  4. 为甚么明明相爱 到最後还是要分开
  5. 是否我们总是 徘徊在心门之外
  6. 谁知道又和你相遇在人海
  7. 命运如此安排 总教人无奈
  8. 这些年过得不好不坏
  9. 只是好像少了一个人存在
  10. 而我渐渐明白 你仍然是我不变的关怀
  11. 有多少爱可以重来 有多少人愿意等待
  12. 当懂得珍惜以後回来
  13. 却不知那份爱 会不会还在
  14. 有多少爱可以重来 有多少人值得等待
  15. 当爱情已经桑田沧海 是否还有勇气去爱
复制代码
[php]
[/home/javalee/myshell]cat ss
#!/bin/ksh
#
#
len=$(cat $1|while read i;do echo $i|wc -c;echo $i;done>tmp$$
n=1;m=2;l=$(cat tmp$$|wc -l)
while ((n<=$l))
do
cat tmp$$|sed -n "${n},${m}p"|tr -d '\n';echo "\n"
((n+=2));((m+=2))
done|tr -s '\n'|sort -nr|tr -s ' '|head -n1|awk '{print $1 $2}'|cut -c1-2
)

cat $1|while read j;do echo $j$(perl -e "print 0 x ($len-${#j})");done>new$1

o=1
while ((o<=$len))
do
tac new$1|sed 's/[ ]*[ ]/aa/g'|tr -d ' '|cut -c$o-$((o+1))|tr -d '\n'
((o+=2));echo "\n"
done|tr -s '\n'|sed 's/aa/  /g'|sed 's/0/ /g'
rm new$1 tmp$$
[/php]
执行后:
  1. [/home/javalee/myshell]ss song
  2. 当有却当有而只这命谁是为常常
  3. 爱多不懂多我是些运知否甚常常
  4. 情少知得少渐好年如道我么後责
  5. 已爱那珍爱渐像过此又们明悔怪
  6. 经可份惜可明少得安和总明没自
  7. 桑以爱以以白了不排你是相有己
  8. 田重  後重  一好  相  爱把
  9. 沧来会回来你个不总遇徘  你当
  10. 海  不来  仍人坏教在徊到留初
  11.   有会  有然存  人人在最下不
  12. 是多还  多是在  无海心後来应
  13. 否少在  少我    奈  门还  该
  14. 还人    人不        之是
  15. 有值    愿变        外要
  16. 勇得    意的          分
  17. 气等    等关          开
  18. 去待    待怀
复制代码
如果加上对标点符号的处理就好啦~~...这是我的笨方法,;),,但是如果文本过大的话,我想就太难了!
发表于 2003-9-27 17:59:58 | 显示全部楼层
有意思: -)
 楼主| 发表于 2003-9-27 18:36:27 | 显示全部楼层
最初由 x11 发表
有意思: -)

呵呵~~,x11兄好久没有来啦~~ ;)
发表于 2004-7-29 17:38:15 | 显示全部楼层
如果使用awk呢?
汉字的编码不都是两个字节吗?
将每一行设为一个awk数组,
每个数组从1-x,x是该行的字符长度;
行数从1-y,用是总行数,
显示的时候提取的数组从y的头两个字符到1的头两个字符是一行,y到1行的3,4字符是第二行,依次类推。标点符号应该也可以。
不知道是否可以。


  1.          1  ... ... x (字符数)
  2.        1
  3.        .
  4.        .
  5.        .
  6.        y (行数)
复制代码
发表于 2004-7-29 18:41:25 | 显示全部楼层
我写了一个awk脚本,
可以实现横排变竖排,
但是要求输入必须正确,
就是标点符号必须是汉语的,
间隔必须是双字节。(太烦琐了)
  1. $ cat test
  2. BEGIN{
  3.         ORS=""
  4.         max=length($0)
  5. }
  6. {
  7.         if (max<length($0)){max=length($0)}
  8.         for(t=1;t<=length($0);t++){array[NR,t]=substr($0,t,1)}
  9. }
  10. END{
  11.         for(n=1;n<=max;n=n+2){
  12.                 for(i=FNR;i>=1;i--){
  13.                         printf "%-2s", array[i,n]array[i,n+1]
  14.                 }
  15.         print "\n"
  16.         }
  17. }

复制代码
  1. $ cat temp
  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. $ awk -f test temp
  30. 还数俱只成一稍唐略惜引江    分看须欲原山顿大惟望万千北  毛  沁
  31. 看风往识吉代逊宗输秦无山    外红晴与驰舞时河余长里里国  泽  园
  32. 今人矣弯思天风宋文皇数如    妖装日天蜡银滔上莽城雪冰风  东  春
  33. 朝物,弓汗骄骚祖采汉英此    娆素,公象蛇滔下莽内飘封光      -
  34. 。,  射,,。,;武雄多    。裹  试,,。,;外。,,      雪
  35.       大          ,竞娇      ,  比          ,
  36.       雕            折,          高
  37.       。            腰            。
  38.                     。


复制代码
发表于 2004-11-21 18:01:48 | 显示全部楼层
好方法,
呵呵,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表