免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6600 | 回复: 22
打印 上一主题 下一主题

[文本处理] shell进行文件换行和替换处理的问题(有实际案例) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-17 20:13 |只看该作者 |倒序浏览
小弟现在银行工作,有一个文件需要在AIX下进行格式处理,麻烦大虾帮忙看看有没有办法用shell命令解决。
该文件正常情况下是以:LST:开头,换行符\x0A结束,但是有些情况下,正常的一行中可能会存在换行符就变成两行或者三行,那怎么才能把该文件整理成正常的以:LST:开头的呢?

我想的办法一是判断每行开头如果不是:LST:,则将此行与上一行连在一起,也就是去掉上一行的换行符,不知道这命令该怎么写!
办法二是先去掉所有行的换行符,把各行连成一行,再从二个:LST:开始替换成换行符+:LST:,但是怎么从第二个:LST:开始替换? 而且在AIX下用sed "s/:LST:/\r:LST:/g",sed "s/:LST:/\n:LST:/g"替换换行,回车都不行  ,还请大家出下高招。

:LST:00000006000000000010000005840301584000016  301584000016  陈荣场
:LST:00000084000000000025000005840301584000016  30158
4000016  姚军凯
:LST:00000149000000000070000005840301584000016  301584000016  郑猛发
:LST:00000260000000000006000005840301584000016  301584000016  刘韦君
:LST:000002810
0000000001000000584030158400
0016  301584000016  卜静文
:LST:00000290000000000015000005840301584000016  301584000016  苏锦  
:LST:00000296000000000024000005840301584000016  301584000016  蔡炳沂

论坛徽章:
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
2 [报告]
发表于 2012-10-17 21:42 |只看该作者
  1. awk '{printf $0}' urfile | sed 's/:LST:/\n&/g'
复制代码
第一行会多出一个空行,你手动把它删掉就可以了,最后一行不会换行,你手动换一下行就可以了。

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
3 [报告]
发表于 2012-10-17 22:05 |只看该作者
本帖最后由 dn833 于 2012-10-17 22:05 编辑
  1. awk 'BEGIN{RS=":LST:"}NF{$1=$1;print RS$0}'
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
4 [报告]
发表于 2012-10-17 23:22 |只看该作者
本帖最后由 blackold 于 2012-10-17 23:25 编辑

回复 1# szqimao


sed:
  1. sed '/^:LST:/{:a;N;/\n:LST:/!{s/\n//;ba};P;D}' urfile
复制代码
awk:
  1. awk -v RS=':LST:' '$0{gsub("\n","",$0);print RS $0}' urfile
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
5 [报告]
发表于 2012-10-18 09:52 |只看该作者
表示比较关心在银行工作这件事。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2012-10-19 11:47 |只看该作者
楼主泄露了用户隐私。哈哈~~
  1. awk 'BEGIN{RS="";FS=":LST:"}{for(i=2;i<=NF;i++)print FS,gensub(/\n/,"","G",$i)}' 1.txt
  2. :LST: 00000006000000000010000005840301584000016  301584000016  陈荣场
  3. :LST: 00000084000000000025000005840301584000016  301584000016  姚军凯
  4. :LST: 00000149000000000070000005840301584000016  301584000016  郑猛发
  5. :LST: 00000260000000000006000005840301584000016  301584000016  刘韦君
  6. :LST: 00000281000000000010000005840301584000016  301584000016  卜静文
  7. :LST: 00000290000000000015000005840301584000016  301584000016  苏锦  
  8. :LST: 00000296000000000024000005840301584000016  301584000016  蔡炳沂
复制代码

论坛徽章:
0
7 [报告]
发表于 2012-10-20 16:31 |只看该作者
(1)awk '{printf "%s",$0}' file>file1  #一行
(2)awk -F':LST:' -v OFS=':LST:' '{for(i=2;i<NF;i++) printf (":LST:%s\n",$i)}' file1 #重新按:LST:分隔符换行

论坛徽章:
0
8 [报告]
发表于 2012-10-22 19:42 |只看该作者
本帖最后由 szqimao 于 2012-10-22 20:01 编辑

这几天忙,今天刚一打开论坛贴子就收到这么多热心回复,真心感谢各位的热情回复。
经过我在系统中逐一测试,lovegod1206 的回答的语句执行后,输出的结果完全满足要求,
另外,blackold 的回答的第二条语句也已经基本接近最终处理结果,可能是blackold觉得没必要再留下最简单的最后一个步骤了吧。
不管怎样感谢各位了,现将所有回复命令的执行结果公布如下:

awk '{printf $0}' urfile | sed 's/:LST:/\n&/g'

n:LST:00000006000000000010000005840301584000016  301584000016  陈荣场n:LST:00000084000000000025000005840301584000016  301584000016  姚军凯n:LST:00000149000000000070000005840301584000016  301584000016  郑猛发n:LST:00000260000000000006000005840301584000016  301584000016  刘韦君n:LST:00000281000000000010000005840301584000016  301584000016  卜静文n:LST:00000290000000000015000005840301584000016  301584000016  苏锦  n:LST:00000296000000000024000005840301584000016  301584000016  蔡炳沂

-------------------------------------------------------------------------------
awk 'BEGIN{RS=":LST:"}NF{$1=$1;print RS$0}'

:LST:LST
:LST:00000006000000000010000005840301584000016  301584000016  陈荣场

:LST:LST
:LST:00000084000000000025000005840301584000016  30158
4000016  姚军凯

:LST:LST
:LST:00000149000000000070000005840301584000016  301584000016  郑猛发

:LST:LST
:LST:00000260000000000006000005840301584000016  301584000016  刘韦君

:LST:LST
:LST:000002810
0000000001000000584030158400
0016  301584000016  卜静文

:LST:LST
:LST:00000290000000000015000005840301584000016  301584000016  苏锦  

:LST:LST
:LST:00000296000000000024000005840301584000016  301584000016  蔡炳沂

-------------------------------------------------------------------------------
sed '/^:LST:/{:a;N;/\n:LST:/!{s/\n//;ba};D}' urfile

sed: 0602-417 The label /^:LST:/{:a;N;/\n:LST:/!{s/\n//;ba};D} is greater than eight characters.[SZ_A_TEST] icsadm:/app/ics
/ly>


awk -v RS=':LST:' '$0{gsub("\n","",$0);print RS $0}' urfile
:LST:LST
:LST:00000006000000000010000005840301584000016  301584000016  陈荣场
:LST:LST
:LST:00000084000000000025000005840301584000016  301584000016  姚军凯
:LST:LST
:LST:00000149000000000070000005840301584000016  301584000016  郑猛发
:LST:LST
:LST:00000260000000000006000005840301584000016  301584000016  刘韦君
:LST:LST
:LST:00000281000000000010000005840301584000016  301584000016  卜静文
:LST:LST
:LST:00000290000000000015000005840301584000016  301584000016  苏锦  
:LST:LST
:LST:00000296000000000024000005840301584000016  301584000016  蔡炳沂

-------------------------------------------------------------------------------
awk 'BEGIN{RS="";FS=":LST:"}{for(i=2;i<=NF;i++)print FS,gensub(/\n/,"","G",$i)}'

:LST: awk: 0602-553 Function gensub is not defined.
The input line number is 1. The file is W1.
The source line number is 1.

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

(1)awk '{printf "%s",$0}' file>file1  #一行

:LST:00000006000000000010000005840301584000016  301584000016  陈荣场:LST:00000084000000000025000005840301584000016  301584000
016  姚军凯:LST:00000149000000000070000005840301584000016  301584000016  郑猛发:LST:00000260000000000006000005840301584000016
  301584000016  刘韦君:LST:00000281000000000010000005840301584000016  301584000016  卜静文:LST:000002900000000000150000058403
01584000016  301584000016  苏锦  :LST:00000296000000000024000005840301584000016  301584000016  蔡炳沂


(2)awk -F':LST:' -v OFS=':LST:' '{for(i=2;i<NF;i++) printf (":LST:%s\n",$i)}' file1 #重新按:LST:分隔符换行

:LST:00000006000000000010000005840301584000016  301584000016  陈荣场
:LST:00000084000000000025000005840301584000016  301584000016  姚军凯
:LST:00000149000000000070000005840301584000016  301584000016  郑猛发
:LST:00000260000000000006000005840301584000016  301584000016  刘韦君
:LST:00000281000000000010000005840301584000016  301584000016  卜静文
:LST:00000290000000000015000005840301584000016  301584000016  苏锦


论坛徽章:
0
9 [报告]
发表于 2012-10-22 19:44 |只看该作者
lovegod1206 和blackold 能大概说一下语句的意思吗?对地我这样的初学者,真的不是太明白。

论坛徽章:
0
10 [报告]
发表于 2012-10-22 19:45 |只看该作者
本帖最后由 szqimao 于 2012-10-22 19:45 编辑
seesea2517 发表于 2012-10-18 09:52
表示比较关心在银行工作这件事。



    不知道你关心啥?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP