标题: 关于"sed"命令合并文本文件上下行的问题
[打印本页]
作者: youaoyi
时间: 2008-8-17 01:40
标题: 关于"sed"命令合并文本文件上下行的问题
sed -e :a -e "/\\$/N; s/\\\n//; ta"
可以将行尾为“\”文本的下一行合并到上一行,
请教:怎样改才能同时将行首为“|”的合并到上一行 ???
另外还要删除文本中所有的空行
急用 拜托了
-= 样本文本见附件 =-
[
Last edited by youaoyi on 2008-8-17 at 04:01 PM ]
附件
1:
a2.rar (2008-8-17 16:01, 458 bytes,下载次数: 25)
作者: youaoyi
时间: 2008-8-17 04:11
sed -e :a -e "/\\$/N; s/\\\n//; ta" -e "$!N;s/\n|/|/;ta" -e "P;D" -e "/./!d" 文件.txt
寻思着修改了一个,但是不管用,不知道什么原因。
[
Last edited by youaoyi on 2008-8-17 at 04:27 AM ]
作者: youaoyi
时间: 2008-8-17 04:20
sed "/^$/d" 文件.txt
单独执行这个,确实能把所有空行删除掉。
作者: HAT
时间: 2008-8-17 11:54
Quote: |
sed -e :a -e "/\\$/N; s/\\\n//; ta" 可以将行首为“\”的文本合并到上一行 |
|
你听别人说的?还是自己亲自试验过?
作者: youaoyi
时间: 2008-8-17 12:51
是自己试验过
这个是把行尾为“\”的下一行合并到上一行
作者: HAT
时间: 2008-8-17 13:03
这样可以吗?
sed "/^$/d" a.txt|sed -e :a -e "/\\$/N; s/\\\n/\\/; ta"|sed ":a;$!N;s/\n|/|/;ta;P;D"
作者: youaoyi
时间: 2008-8-17 13:34
不行 命令无效
样本如下,最终求生成9条不含空行的文本,
文本中数据行的第一位是已经编好的序号。
[
Last edited by youaoyi on 2008-8-17 at 04:01 PM ]
附件
1:
a2.rar (2008-8-17 16:01, 458 bytes,下载次数: 2)
作者: HAT
时间: 2008-8-17 13:45
按照你的规则,应该是10行啊,"徐"和"秀清"中间的那个换行不符合删除要求啊。
作者: youaoyi
时间: 2008-8-17 14:54
是的 整理例子时 忘记在这条数据后“徐”之后加上“\”了,抱歉。
已经更改了附件
作者: HAT
时间: 2008-8-17 15:48
你的sed版本的问题吧
Quote: |
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\ProgramMy\GnuWin32>sed "/^$/d" a.txt|sed -e :a -e "/\\$/N; s/\\\n//; ta"|sed ":a;$!N;s/\n|/|/;ta;P;D"
1|370105|倒闭|经济原因|韩翌|200537015018509|49307.5|
2|370108|倒闭|其它:|丁伟东|20083701085005903|10.0|
3|370707|倒闭|其它:|陈汝\芳|2008370707000949|10.0|
4|372407|倒闭|其它:|徐秀清|2008375007437|1990.0|
5|372804|倒闭|经济原因|洪振飞|2002372878229|2550.0|
6|372407|倒闭|其它:|边爱玲|200837215015010082|3990.0|
7|372909|倒闭|其它:|杨留更|200837290015002744|9990.0|
8|370454|倒闭|其它:|孟庆国|200837045015000127|10.0|
9|370454|倒闭|其它:|孟庆国|2008370405015000127|10.0|
C:\ProgramMy\GnuWin32>sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law. |
|
[
Last edited by HAT on 2008-8-17 at 03:50 PM ]
作者: youaoyi
时间: 2008-8-17 16:03
不是的 麻烦下载下附件 a2.txt
原来的是我手工录入的,可以达到目的。
但是第10条之后的是原本的数据,就不行了。
作者: youaoyi
时间: 2008-8-17 16:05
一楼、七楼都已经更新了附件。
作者: HAT
时间: 2008-8-17 16:16
你是说"徐慧"那一行对吧,那里有一个Windows下不可见的字符,你用16进制编辑器打开看看就知道了。
你把"|徐慧|"删除,重新输入一遍就可以了。
作者: youaoyi
时间: 2008-8-17 16:18
是的,但是象这种情况在文本中非常非常多,
这种不可见的字符,能否在sed处理时一并删除掉呢?
数据量很大,拜托了。
作者: HAT
时间: 2008-8-17 16:19
你的文本文件是不是从Linux或者Unix系统里面拷过来的?
作者: youaoyi
时间: 2008-8-17 16:21
可能是Unix系统里面拷过来的,只能得到这种文本。
无法在最初提取数据时处理,因为是上面发下来的。
[
Last edited by youaoyi on 2008-8-17 at 04:23 PM ]
作者: HAT
时间: 2008-8-17 16:35
我暂时也没有想到什么办法,帮你在QQ群里面问问吧。
作者: youaoyi
时间: 2008-8-17 16:36
谢谢 谢谢 拜托了
作者: HAT
时间: 2008-8-17 16:40
还有其他包含不可见字符的行吗?我想看看那些不可见字符是不是相同的。
作者: youaoyi
时间: 2008-8-17 17:00
因为周末只带回来一个数据文本
暂时在这个文本中找到另外这些
请审阅。
附件
1:
另外一些样本.rar (2008-8-17 17:00, 360 bytes,下载次数: 7)
作者: HAT
时间: 2008-8-17 18:08
change a2.txt /from "&H0D7C" /to "&H7C"
sed "/^$/d" a2.txt|sed -e :a -e "/\\$/N; s/\\\n//; ta"|sed ":a;$!N;s/\n|/|/;ta;P;D"
change.exe
http://upload.cn-dos.net/img/427.zip
作者: youaoyi
时间: 2008-8-17 18:20
change.exe
http://upload.cn-dos.net/img/427.zip
此网页打不开,下载不了。辛苦了。
[
Last edited by youaoyi on 2008-8-17 at 06:22 PM ]
作者: HAT
时间: 2008-8-17 18:28
试试这个
change.exe
http://bbs.bathome.cn/attachment.php?aid=218
作者: radem
时间: 2008-8-17 18:48
Quote: |
Originally posted by HAT at 2008-8-17 06:08 PM:
change a2.txt /from "&H0D7C" /to "&H7C"
sed "/^$/d" a2.txt|sed -e :a -e "/\\$/N; s/\\\n//; ta"|sed ":a;$!N;s/\n|/|/;ta;P;D" ... |
|
我的测试结果:
1.不可见字符成功删除
2.有/和|字符的没有达到楼主效果(SED 4.1.5)
另:
change 后 a2.txt 变成 A2.TXT 了,能否保持小写呢
作者: youaoyi
时间: 2008-8-17 19:04
下载完毕
是否这个 change 命令不支持变量的? 运行失败了。
我测试时候是用的程式在附件中,抑或是哪里我写错了?
附件
1:
test.rar (2008-8-17 19:04, 492 bytes,下载次数: 3)
作者: youaoyi
时间: 2008-8-17 19:05
因为有很多文本,所以采用了上面这种拖拉文件来执行的方式。
作者: HAT
时间: 2008-8-17 19:54
很多个文件,这样可以满足要求吗?
@echo off
for %%a in ("*.txt") do (
change "%%a" /from "&H0D7C" /to "&H7C"
sed "/^$/d" "%%a"|sed -e :a -e "/\\$/N; s/\\\n//; ta"|sed ":a;$!N;s/\n|/|/;ta;P;D"
)
作者: HAT
时间: 2008-8-17 19:56
标题: Re 24楼
我和楼主都测试成功了,可能是的测试方法有问题吧^_^
保持小写:
ren A.TXT a.txt
作者: youaoyi
时间: 2008-8-17 20:20
麻烦给看一下25搂的附件,是不是有什么问题?
因为之前都是通过这种方式来处理的。
楼上的程式确实可以处理正确。
但是有三个问题:
1、如何将同目录下各文本文件处理后生成对应源文件名称的新文档?
2、好像是不支持长文件名的处理;
3、通过“>新文档.txt”这种方式输出的话,新文本开头会有下面的字符:
Invalid keyboard code specified
CHANGE pgm by Bruce Guthrie, (c)2001 U.S. Dept of Commerce Revised 03/10/2001
Input file: 原始数据.TXT /-S /ATTR=-H-S-R
Flag file: None created
Temp file: C:\1\{CHANGE}.TMP
Output file: Overwriting input file
Change from >
|<, to >|<
Other settings: /I /BINARY /-TRIM /-ZAPNULL /-VERIFY
20:15:17: Reading C:\1\原始数据.TXT --> C:\1\{CHANGE}.TMP
Bytes read: 11,045,417 Left: 0 Changes made: 23
Copying temporary file over original file...11,045,394 bytes
20:15:17: Done
当然,问题是已经解决大半了,在此深深表示谢意。
[
Last edited by youaoyi on 2008-8-17 at 08:39 PM ]
作者: HAT
时间: 2008-8-17 22:13
1. 处理之前copy一下就行了
2. 哪个命令不支持长文件名的处理?
3. 如果你用的中文版系统,可以在change之前加一句:
chcp 437>nul & graftabl 936>nul
作者: youaoyi
时间: 2008-8-17 22:56
我是使用的中文XP,
chcp 437>nul & graftabl 936>nul 加上这句,
新生成的文本中开头还是有29搂那段说明文字。
不支持长文件名这个问题应该是我误解了。
还有,听说change 命令是支持处理子目录中的文件的,
下面这段应该
怎么修改才能同时处理所在目录下的包括子目录中的所有文本呢?
能直接修改原文件就可以,
在处理之前我就把这些文件全部拷贝到一个目录下的多个目录中。
(不能全部都放在同一个目录下,因为大量的文件名称是重复的)
chcp 437>nul & graftabl 936>nul
for %%a in ("*.txt") do (
change "%%a" /from "&H0D7C" /to "&H7C"
sed "/^$/d" "%%a"|sed -e :a -e "/\\$/N; s/\\\n//; ta"|sed ":a;$!N;s/\n|/|/;ta;P;D"
)
[
Last edited by youaoyi on 2008-8-17 at 11:03 PM ]
作者: HAT
时间: 2008-8-18 10:00
@echo off
set SrcFolder=C:\test
for /f "tokens=*" %%a in ('dir /s /b "*.txt"') do (
change "%%a" /from "&H0D7C" /to "&H7C"
sed "/^$/d" "%%a"|sed -e :a -e "/\\$/N; s/\\\n//; ta"|sed ":a;$!N;s/\n|/|/;ta;P;D"
)
作者: youaoyi
时间: 2008-8-18 12:14
这样执行后,只能输出到屏幕显示啊? 原文件的内容依然带有乱字符.
批量处理该如何添加象">"这样的输出符呢? 不好意思,我是新手...
作者: HAT
时间: 2008-8-18 13:35
change.exe本来就是修改原文件的啊,不用重定向输出。
@echo off
set SrcFolder=C:\test
for /f "tokens=*" %%a in ('dir /s /b "%SrcFolder%\*.txt"') do (
change "%%a" /from "&H0D7C" /to "&H7C"
sed "/^$/d" "%%a"|sed -e :a -e "/\\$/N; s/\\\n//; ta"|sed ":a;$!N;s/\n|/|/;ta;P;D">>"%%~na.new"
)
for /f "tokens=*" %%a in ('dir /s /b "%SrcFolder%\*.new"') do (
ren "%%a" "%%~na.txt"
)
作者: youaoyi
时间: 2008-8-18 14:28
反复用下面的程式进行测试
chcp 437>nul & graftabl 936>nul
for %%a in ("*.txt") do (
change "%%a" /from "&H0D7C" /to "&H7C"
)
pause
虽然说能执行,但是实际上无法替换文本中的 0D7C 字段,
原文本用UT打开还是能查看到 0D7C 字段.
难道是第二个下载点的 change.exe 版本不行 ?
另外34楼的程式好像有问题,生成的新文本,连文本应该存在的分行都消失了.
[
Last edited by youaoyi on 2008-8-18 at 02:43 PM ]
作者: HAT
时间: 2008-8-18 14:44
不支持长文件名,就用短文件名吧:
@echo off
set SrcFolder=C:\test
for /f "tokens=*" %%a in ('dir /s /b "%SrcFolder%\*.txt"') do (
change "%%~sfa" /from "&H0D7C" /to "&H7C"
sed "/^$/d" "%%a"|sed -e :a -e "/\\$/N; s/\\\n//; ta"|sed ":a;$!N;s/\n|/|/;ta;P;D"
)
作者: youaoyi
时间: 2008-8-18 15:31
好的 原来自己被文件名的长短给折腾了
非常感谢 HAT 的帮助 ,谢谢谢谢!