免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: linuxzmy
打印 上一主题 下一主题

[文本处理] awk sed命令求解 [复制链接]

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
11 [报告]
发表于 2014-03-19 11:11 |只看该作者
本帖最后由 jason680 于 2014-03-19 11:15 编辑

回复 5# jason680

There is simple way if you don't care about the data sequence




# awk -F: 'NF>1{if(a[$1]==""){a[$1]=$2}else{a[$1]=a[$1]" "$2}}END{for(n in a)print n":"a[n]}' FILE
again: 666
a b c: 111  123  234
new: 555
aaa: 222  123  234
abc: 222  123  234
a a a: 111  123  234


--------------------------------------------------------------

# awk -F: '{
printf("%-15s#NR=%d,NF=%d,$1=%s,$2=%s, before: a[%s]=%s\n",$0,NR,NF,$1,$2,$1,a[$1])}
NF>1{if(a[$1]==""){a[$1]=$2;b[++c]=$1}else{a[$1]=a[$1]" "$2}}
END{for(n=1;n<=c;n++)print b[n]":"a[b[n]]}' FILE
abc: 222       #NR=1,NF=2,$1=abc,$2= 222, before: a[abc]=
a b c: 111     #NR=2,NF=2,$1=a b c,$2= 111, before: a[a b c]=
aaa: 222       #NR=3,NF=2,$1=aaa,$2= 222, before: a[aaa]=
a a a: 111     #NR=4,NF=2,$1=a a a,$2= 111, before: a[a a a]=
               #NR=5,NF=0,$1=,$2=, before: a[]=
abc: 123       #NR=6,NF=2,$1=abc,$2= 123, before: a[abc]= 222
a b c: 123     #NR=7,NF=2,$1=a b c,$2= 123, before: a[a b c]= 111
aaa: 123       #NR=8,NF=2,$1=aaa,$2= 123, before: a[aaa]= 222
a a a: 123     #NR=9,NF=2,$1=a a a,$2= 123, before: a[a a a]= 111
new: 555       #NR=10,NF=2,$1=new,$2= 555, before: a[new]=
               #NR=11,NF=0,$1=,$2=, before: a[]=
abc: 234       #NR=12,NF=2,$1=abc,$2= 234, before: a[abc]= 222  123
a b c: 234     #NR=13,NF=2,$1=a b c,$2= 234, before: a[a b c]= 111  123
aaa: 234       #NR=14,NF=2,$1=aaa,$2= 234, before: a[aaa]= 222  123
a a a: 234     #NR=15,NF=2,$1=a a a,$2= 234, before: a[a a a]= 111  123
again: 666     #NR=16,NF=2,$1=again,$2= 666, before: a[again]=
abc: 222  123  234
a b c: 111  123  234
aaa: 222  123  234
a a a: 111  123  234
new: 555
again: 666


   

论坛徽章:
1
白羊座
日期:2013-12-29 17:58:28
12 [报告]
发表于 2014-03-19 11:47 |只看该作者
本帖最后由 newoz 于 2014-03-19 11:48 编辑

回复 9# ly5066113

很厉害啊。 慢慢看,慢慢理解。 思路不是太复杂,但是对sed驾驭的能力要精炼很多。+++++
  1. $ sedsed -d ':a;N;s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/;$!ba;s/\n\+/\n/g' file
  2. PATT:abc: 222$
  3. HOLD:$
  4. COMM::a
  5. COMM:N
  6. PATT:abc: 222\na b c: 111$
  7. HOLD:$
  8. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  9. PATT:abc: 222\na b c: 111$
  10. HOLD:$
  11. COMM:$ !b a
  12. COMM:N
  13. PATT:abc: 222\na b c: 111\naaa: 222$
  14. HOLD:$
  15. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  16. PATT:abc: 222\na b c: 111\naaa: 222$
  17. HOLD:$
  18. COMM:$ !b a
  19. COMM:N
  20. PATT:abc: 222\na b c: 111\naaa: 222\na a a: 111$
  21. HOLD:$
  22. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  23. PATT:abc: 222\na b c: 111\naaa: 222\na a a: 111$
  24. HOLD:$
  25. COMM:$ !b a
  26. COMM:N
  27. PATT:abc: 222\na b c: 111\naaa: 222\na a a: 111\n$
  28. HOLD:$
  29. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  30. PATT:abc: 222\na b c: 111\naaa: 222\na a a: 111\n$
  31. HOLD:$
  32. COMM:$ !b a
  33. COMM:N
  34. PATT:abc: 222\na b c: 111\naaa: 222\na a a: 111\n\nabc: 123$             # 关键的替换在这里
  35. HOLD:$
  36. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  37. PATT:abc: 222 123\na b c: 111\naaa: 222\na a a: 111\n$
  38. HOLD:$
  39. COMM:$ !b a
  40. COMM:N
  41. PATT:abc: 222 123\na b c: 111\naaa: 222\na a a: 111\n\na b c: 123$
  42. HOLD:$
  43. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  44. PATT:abc: 222 123\na b c: 111 123\naaa: 222\na a a: 111\n$
  45. HOLD:$
  46. COMM:$ !b a
  47. COMM:N
  48. PATT:abc: 222 123\na b c: 111 123\naaa: 222\na a a: 111\n\naaa: 123$
  49. HOLD:$
  50. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  51. PATT:abc: 222 123\na b c: 111 123\naaa: 222 123\na a a: 111\n$
  52. HOLD:$
  53. COMM:$ !b a
  54. COMM:N
  55. PATT:abc: 222 123\na b c: 111 123\naaa: 222 123\na a a: 111\n\na a a:\
  56. 123$
  57. HOLD:$
  58. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  59. PATT:abc: 222 123\na b c: 111 123\naaa: 222 123\na a a: 111 123\n$
  60. HOLD:$
  61. COMM:$ !b a
  62. COMM:N
  63. PATT:abc: 222 123\na b c: 111 123\naaa: 222 123\na a a: 111 123\n\nne\
  64. w: 555$
  65. HOLD:$
  66. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  67. PATT:abc: 222 123\na b c: 111 123\naaa: 222 123\na a a: 111 123\n\nne\
  68. w: 555$
  69. HOLD:$
  70. COMM:$ !b a
  71. COMM:N
  72. PATT:abc: 222 123\na b c: 111 123\naaa: 222 123\na a a: 111 123\n\nne\
  73. w: 555\n$
  74. HOLD:$
  75. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  76. PATT:abc: 222 123\na b c: 111 123\naaa: 222 123\na a a: 111 123\n\nne\
  77. w: 555\n$
  78. HOLD:$
  79. COMM:$ !b a
  80. COMM:N
  81. PATT:abc: 222 123\na b c: 111 123\naaa: 222 123\na a a: 111 123\n\nne\
  82. w: 555\n\nabc: 234$
  83. HOLD:$
  84. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  85. PATT:abc: 222 123 234\na b c: 111 123\naaa: 222 123\na a a: 111 123\n\
  86. \nnew: 555\n$
  87. HOLD:$
  88. COMM:$ !b a
  89. COMM:N
  90. PATT:abc: 222 123 234\na b c: 111 123\naaa: 222 123\na a a: 111 123\n\
  91. \nnew: 555\n\na b c: 234$
  92. HOLD:$
  93. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  94. PATT:abc: 222 123 234\na b c: 111 123 234\naaa: 222 123\na a a: 111 1\
  95. 23\n\nnew: 555\n$
  96. HOLD:$
  97. COMM:$ !b a
  98. COMM:N
  99. PATT:abc: 222 123 234\na b c: 111 123 234\naaa: 222 123\na a a: 111 1\
  100. 23\n\nnew: 555\n\naaa: 234$
  101. HOLD:$
  102. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  103. PATT:abc: 222 123 234\na b c: 111 123 234\naaa: 222 123 234\na a a: 1\
  104. 11 123\n\nnew: 555\n$
  105. HOLD:$
  106. COMM:$ !b a
  107. COMM:N
  108. PATT:abc: 222 123 234\na b c: 111 123 234\naaa: 222 123 234\na a a: 1\
  109. 11 123\n\nnew: 555\n\na a a: 234$
  110. HOLD:$
  111. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  112. PATT:abc: 222 123 234\na b c: 111 123 234\naaa: 222 123 234\na a a: 1\
  113. 11 123 234\n\nnew: 555\n$
  114. HOLD:$
  115. COMM:$ !b a
  116. COMM:N
  117. PATT:abc: 222 123 234\na b c: 111 123 234\naaa: 222 123 234\na a a: 1\
  118. 11 123 234\n\nnew: 555\n\nagain: 666$
  119. HOLD:$
  120. COMM:s/\([^\n:]\+:\)\([^\n]\+\)\(.*\)\n\1\([^\n]\+\)/\1\2\4\3/
  121. PATT:abc: 222 123 234\na b c: 111 123 234\naaa: 222 123 234\na a a: 1\
  122. 11 123 234\n\nnew: 555\n\nagain: 666$
  123. HOLD:$
  124. COMM:$ !b a
  125. COMM:s/\n\+/\n/g
  126. PATT:abc: 222 123 234\na b c: 111 123 234\naaa: 222 123 234\na a a: 1\
  127. 11 123 234\nnew: 555\nagain: 666$
  128. HOLD:$
  129. abc: 222 123 234
  130. a b c: 111 123 234
  131. aaa: 222 123 234
  132. a a a: 111 123 234
  133. new: 555
  134. again: 666
复制代码

论坛徽章:
3
水瓶座
日期:2014-02-20 12:02:14天蝎座
日期:2014-03-19 14:04:46水瓶座
日期:2014-07-26 20:01:02
13 [报告]
发表于 2014-03-19 14:11 |只看该作者
这个感觉easy  我也来试试
awk -F ":" '$0!=""{a[$1]=a[$1]"\t"$2}END{for( i in a)print i":"a[i]}' yourfile

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
14 [报告]
发表于 2014-03-19 23:34 |只看该作者
  1. awk -F: '$0{if(!a[$1]++)b[++n]=$1;c[$1]=c[$1]?c[$1]" "$2:$0}END{for(i=0;i++<n;)print c[b[i]]}'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP