免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助:文本内容指定位置换行 [复制链接]

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-10 06:20:00每日论坛发贴之星
日期:2015-10-10 06:20:00程序设计版块每日发帖之星
日期:2015-10-11 06:20:00程序设计版块每日发帖之星
日期:2015-10-25 06:20:00
11 [报告]
发表于 2015-10-07 18:41 |只看该作者
实在抱歉,之前我描述的问题不详细。我的意思是在文本文件中的指定字节数位置能够自动换行就可以。指定字节数的位置肯定不会出现文字要分开的情况。
文件内容中有包含空格的情况。
#cat test.txt
12□□56789□□□weaeaweawe□□□□□1223汉字21434314r513□□dasdssdads
上面记录中的□代表只占一个字节的空格的意思。

换行位置在每行的第10个byte开始,换行之后的文件如下:
被拆分的每行记录(包括空格)所占的字节总数为9。

#cat new.txt
12  56789
   weaeaw
eawe     
1223汉字2
1434314r5
13  dasds
sdads

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
12 [报告]
发表于 2015-10-07 20:49 |只看该作者
本帖最后由 Herowinter 于 2015-10-07 21:03 编辑

回复 11# robinhappiness


试试这个吧,再不行我也不会了。。。
  1. awk '{j=0;s=1;for(i=1;i<=length($0);i++){c=substr($0,i,1);if(c>"\177")j+=2;else j+=1;if(j>=9){print substr($0,s,i-s+1);j=0;s=i+1}}}' test.txt
复制代码
效果这样的:


   

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-10 06:20:00每日论坛发贴之星
日期:2015-10-10 06:20:00程序设计版块每日发帖之星
日期:2015-10-11 06:20:00程序设计版块每日发帖之星
日期:2015-10-25 06:20:00
13 [报告]
发表于 2015-10-07 23:11 |只看该作者
本帖最后由 robinhappiness 于 2015-10-07 23:50 编辑

回复 12# Herowinter

非常感谢耐心解答!可能我的意思还是没有完全表达明白,实在抱歉!

#cat text.txt
123456789a  bcdefghij   klm汉字12345拼音67  891023

换行肯定是从第10个byte开始换,出现在第10个byte位置的内容肯定不会出现占两个byte的汉字,并且第10个byte肯定有值(不为空)。

对text.txt的处理过程,分割后的每行长度都是整好9个byte,每次处理过程如下:

第一次处理,在第十个字节位置换行:
123456789
a  bcdefghij   klm汉字12345拼音67

第二次处理,在第十个字节位置换行:
123456789
a  bcdefg
hij   klm汉字12345拼音67  891023

第三次处理,在第十个字节位置换行:
123456789
a  bcdefg
hij   klm
汉字12345拼音67  891023

第四次处理,在第十个字节位置换行:
123456789
a  bcdefg
hij   klm
汉字12345
拼音67


如下的这种换行情况是不会出现的,:
123456789
汉字汉字汉
字汉字123
12345678

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-10 06:20:00每日论坛发贴之星
日期:2015-10-10 06:20:00程序设计版块每日发帖之星
日期:2015-10-11 06:20:00程序设计版块每日发帖之星
日期:2015-10-25 06:20:00
14 [报告]
发表于 2015-10-08 08:20 |只看该作者
简单的说就是被分割的文件内容没有换行
#cat test.txt
123456  91文字213141516171819202122abcd

命令执行后,指定从每行的第9个byte之后也就是第10个byte开始换行,经过命令分割之后文件如下,每行正好占9个byte。
被分割的对象的换行位置(第10个byte的位置)肯定有值。
#cat new.txt
123456  9
1文字2131
41516171
81920212
2abcd

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-10 06:20:00每日论坛发贴之星
日期:2015-10-10 06:20:00程序设计版块每日发帖之星
日期:2015-10-11 06:20:00程序设计版块每日发帖之星
日期:2015-10-25 06:20:00
15 [报告]
发表于 2015-10-08 09:17 |只看该作者
回复 12# Herowinter

你好!我测试了一下这个命令,从第10byte开始换行OK.

之后我又做了一个测试,如果被分割的文件内容有6200个字节长,想要对无换行的文件内容的每3000byte进行一次换行时,将如下命令j>=9修改成j>=3000,之后运行结果发现在输出文件在第一行的3001byte的位置虽然正确换行,但输出文件中的3000byte以后的数据(3001byte~6200byte)全部消失了。请教一下是在哪里出的问题?多谢了!

awk '{j=0;s=1;for(i=1;i<=length($0);i++){c=substr($0,i,1);if(c>"\177")j+=2;else j+=1;if(j>=3000){print substr($0,s,i-s+1);j=0;s=i+1}}}' test.txt

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
16 [报告]
发表于 2015-10-08 10:18 |只看该作者
本帖最后由 Herowinter 于 2015-10-08 10:18 编辑

回复 15# robinhappiness

有个bug忘了输出最后剩下的字符串了,试试这个.
  1. awk '{j=0;s=1;for(i=1;i<=length($0);i++){c=substr($0,i,1);if(c>"\177")j+=2;else j+=1;if(j>=3000){print substr($0,s,i-s+1);j=0;s=i+1}};if(s<=length($0))print substr($0,s)}' test.txt
复制代码

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-10 06:20:00每日论坛发贴之星
日期:2015-10-10 06:20:00程序设计版块每日发帖之星
日期:2015-10-11 06:20:00程序设计版块每日发帖之星
日期:2015-10-25 06:20:00
17 [报告]
发表于 2015-10-08 11:47 |只看该作者
回复 16# Herowinter

执行了这个命令,出现一个状况:
如果被分割的对象如果都是只占一个byte的字母或者数字符号等,都能够正确的每3000byte换行。

但如果在3001byte的位置是汉字或者汉字以外(占两个byte)的字符话,3001byte位置的汉字以及汉字后面的内容就全部无法显示出来。也就是说3001byte开始的汉字以及汉字以后的内容就全被清除了!
或者在30001byte换行之前出现汉字或者全角字符(占两个byte)的字符话,字符以及字符后面的内容也全部不显示,被清除掉了!请教如何解决?谢谢!

awk '{j=0;s=1;for(i=1;i<=length($0);i++){c=substr($0,i,1);if(c>"\177")j+=2;else j+=1;if(j>=3000){print substr($0,s,i-s+1);j=0;s=i+1}};if(s<=length($0))print substr($0,s)}' test.txt

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
18 [报告]
发表于 2015-10-08 12:09 |只看该作者
回复 17# robinhappiness

贴个简化的问题描述出来吧, 这样我很难理解.
只需要:

初始文本
期望结果
实际结果

这三项就可以了.
   

论坛徽章:
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
19 [报告]
发表于 2015-10-08 12:29 |只看该作者
  1. sed 's/./&\n/9;P;D'
复制代码

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-10 06:20:00每日论坛发贴之星
日期:2015-10-10 06:20:00程序设计版块每日发帖之星
日期:2015-10-11 06:20:00程序设计版块每日发帖之星
日期:2015-10-25 06:20:00
20 [报告]
发表于 2015-10-08 13:10 |只看该作者
回复 18# Herowinter

谢谢!

初始文本
1234汉字789w  rdfdfg中国abcd

期望结果
1234汉字7
89w  rdfd
fg中国abc
d

实际结果
1234


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP