Board logo

标题: 关于"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 的帮助 ,谢谢谢谢!