免费注册 查看新帖 |

Chinaunix

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

[文本处理] 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  蔡炳沂

论坛徽章:
0
2 [报告]
发表于 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
3 [报告]
发表于 2012-10-22 19:44 |显示全部楼层
lovegod1206 和blackold 能大概说一下语句的意思吗?对地我这样的初学者,真的不是太明白。

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



    不知道你关心啥?

论坛徽章:
0
5 [报告]
发表于 2012-10-22 19:47 |显示全部楼层
L_kernel 发表于 2012-10-19 11:47
楼主泄露了用户隐私。哈哈~~


我已经把卡号,金额等去掉了,只留个名字应该还好吧。

论坛徽章:
0
6 [报告]
发表于 2012-10-22 21:02 |显示全部楼层
yestreenstars 发表于 2012-10-22 20:40
你运行我那条命令
awk '{printf $0}' urfile | sed 's/:LST:/\n&/g'
之所以会产生下面这种情况,我想你应 ...


嗯,我是在AIX系统中运行的,明天上班的时候再试一下吧,但是我想我应该是没有多打一个n的。
上班的时候上不了论坛,只有回到家才能回复你了。

论坛徽章:
0
7 [报告]
发表于 2012-10-23 19:54 |显示全部楼层
本帖最后由 szqimao 于 2012-10-23 22:16 编辑
yestreenstars 发表于 2012-10-22 20:40
你运行我那条命令
awk '{printf $0}' urfile | sed 's/:LST:/\n&/g'
之所以会产生下面这种情况,我想你应 ...


我又试了,确实不对,可能sed中不能用\n转义吧。

论坛徽章:
0
8 [报告]
发表于 2012-10-23 19:57 |显示全部楼层
525478495 发表于 2012-10-23 09:11
新手也来凑热闹。data2保存LZ给的范例
cat data2 |tr -d '\n'  | awk  -F':LST:' '{for(i=2;i


嗯,这样写法也正确。

论坛徽章:
0
9 [报告]
发表于 2012-10-23 19:59 |显示全部楼层
在银行干活也跟在其它公司干的差不多,不过在银行掌握业务流程比掌握技术更重要些。

论坛徽章:
0
10 [报告]
发表于 2012-10-24 19:30 |显示全部楼层
今天又发现个问题,如果文件里只有一行数据,也就是只一行以:LST开头的数据时,之前的命令没有输出!!!!
求解.

:LST:0000000600
00000000100000058403
01584000016  301584000016  陈荣场

(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:分隔符换行

cat data2 |tr -d '\n'  | awk  -F':LST:' '{for(i=2;i<NF;i++)print ":LST:" $i}'



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP