免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3350 | 回复: 4

awk练手的小程序-横竖格式转换 [复制链接]

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

代码如下,已完成中英文混排的问题,解决方法比较粗糙,希望大家指正


  1. BEGIN {FS=""}
  2. {
  3.     i=1;
  4.     j=1;
  5.     while (i<=NF)
  6.     {
  7.         if ($i ~ /[ -~]/)
  8.         {#非中文字符后面补一个空格,使其和中文字符占位一致
  9.             Filds[j,NR]=$i" ";
  10.             i++;
  11.         }
  12.         else
  13.         {#我的机器上一个汉字用三位编码表示,所以串接三个字段
  14.             Filds[j,NR]=$i""$(i+1)""$(i+2);
  15.             i+=3;
  16.         }
  17.         j++;
  18.     }
  19.    maxNF=(maxNF<j)?(j-1):maxNF;
  20. }
  21. END {
  22.     for(i=1;i<=maxNF;i++)
  23.     {
  24.         for(j=NR;j>=1;j--)
  25.             if (Filds[i,j]=="")
  26.                 printf("  ")
  27.             else
  28.                     printf("%s",Filds[i,j]);
  29.         printf("\n");
  30.    }
  31. }
复制代码

[ 本帖最后由 jinl 于 2008-1-11 20:05 编辑 ]

论坛徽章:
0
发表于 2008-01-11 23:35 |显示全部楼层
用 cut + paste + rev 也可以


  1. [lgfang@fbbox ~/tmp]$ cat test.sh
  2. #!/usr/local/bin/bash
  3. col=1
  4. tmp=$(cut -c $col  test.txt)
  5. while [ ! -z "$tmp" ] ; do
  6.     echo  $tmp | paste -s /dev/fd/0 | rev
  7.     col=$((col+1))
  8.     tmp=$(cut -c $col  test.txt)
  9. done
  10. [lgfang@fbbox ~/tmp]$ ./test.sh
  11. 老 玳 金 梨 五 先 与 临 绛 来 霍 观 昔
  12. 夫 筵 粟 园 十 帝 余 颍 唇 如 如 者 有
  13. 不 急 堆 子 年 侍 问 美 珠 雷 羿 如 佳
  14. 知 管 前 弟 间 女 答 人 袖 霆 射 山 人
  15. 其 曲 木 散 似 八 既 在 两 收 九 色 公
  16. 所 复 已 如 反 千 有 白 寂 震 日 沮 孙
  17. 往 终 拱 烟 掌 人 以 帝 寞 怒 落 丧 氏
  18. , , , , , , , , , , , , ,
  19. 足 乐 瞿 女 风 公 感 妙 晚 罢 矫 天 一
  20. 茧 极 塘 乐 尘 孙 时 舞 有 如 如 地 舞
  21. 荒 哀 石 余 鸿 剑 抚 此 弟 江 群 为 剑
  22. 山 来 城 姿 洞 器 事 曲 子 海 帝 之 器
  23. 转 月 草 映 昏 初 增 神 传 凝 骖 久 动
  24. 愁 东 萧 寒 王 第 惋 扬 芬 清 龙 低 四
  25. 疾 出 瑟 日 室 一 伤 扬 芳 光 翔 昂 方
  26. 。 。 。 。 。 。 。 。 。 。 。 。 。
  27. [lgfang@fbbox ~/tmp]$
  28. [lgfang@fbbox ~/tmp]$
  29. [lgfang@fbbox ~/tmp]$ cat test.txt
  30. 昔有佳人公孙氏,一舞剑器动四方。
  31. 观者如山色沮丧,天地为之久低昂。
  32. 霍如羿射九日落,矫如群帝骖龙翔。
  33. 来如雷霆收震怒,罢如江海凝清光。
  34. 绛唇珠袖两寂寞,晚有弟子传芬芳。
  35. 临颍美人在白帝,妙舞此曲神扬扬。
  36. 与余问答既有以,感时抚事增惋伤。
  37. 先帝侍女八千人,公孙剑器初第一。
  38. 五十年间似反掌,风尘鸿洞昏王室。
  39. 梨园子弟散如烟,女乐余姿映寒日。
  40. 金粟堆前木已拱,瞿塘石城草萧瑟。
  41. 玳筵急管曲复终,乐极哀来月东出。
  42. 老夫不知其所往,足茧荒山转愁疾。
复制代码

论坛徽章:
0
发表于 2008-01-12 12:30 |显示全部楼层
不等长的语句试过么?
我的awk可以解决中英文混排,不等长语句的问题

论坛徽章:
0
发表于 2008-01-15 18:09 |显示全部楼层
一行就能搞定吧awk  'BEGIN{FS=""}{for(i=1;i<=NF;i++){a[i]=(a[i])?$i""a[i]:$i};wokao=(wokao<NF)?NF:wokao}END{for(x=1;x<=wokao;x++)print a[x]}'

[[i] 本帖最后由 nuclearxin 于 2008-1-15 18:10 编辑 [/i]]

论坛徽章:
0
发表于 2008-01-16 09:08 |显示全部楼层
原帖由 nuclearxin 于 2008-1-15 18:09 发表
一行就能搞定吧awk  'BEGIN{FS=""}{for(i=1;i

这个也能算一行?那其不是所有的程序都是一行

另: 你的代码中英文混排的格式,在我的机器上有问题 (Ubuntu 7.10)

[ 本帖最后由 jinl 于 2008-1-16 09:09 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时7.5折

【架构革新 自主可控】2020年6月4日~6日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP