Board logo

标题: [文本处理] [已解决]批处理如何判断文本中以指定字符分割的每一行的指定字段的数据并进行相应处理 [打印本页]

作者: xslxslxsl    时间: 2011-6-22 22:48     标题: [已解决]批处理如何判断文本中以指定字符分割的每一行的指定字段的数据并进行相应处理

本帖最后由 pcl_test 于 2016-8-9 23:48 编辑

现有一个文件夹中有多个已ABC开头的文本文件(ABC1.TXT,ABC2.TXT......),文本的结构相同,下面数据中的空格实际上系TAB键,以tab键分隔数据
12 34 56 7 9 23
66 7 8 9 9 111
888 7 65 4 0 8
a b2 6t 11 33 6
a b c 6 9 i1
。。。。。。
将第四个空后的数据进行比较,若为9,则将整行删除,留下的数据另存
888 7 65 4 0 8
a b2 6t 11 33 6
。。。。。。
(即对文本数据中的第五列数据进行判断,若为9就将此行删除)
麻烦高手具体指点,不胜感激。
作者: tmplinshi    时间: 2011-6-22 23:14

本帖最后由 tmplinshi 于 2011-6-22 23:15 编辑
  1. sed -i "/^.*\t\+.*\t\+.*\t\+.*\t\+9\t\+/d" *.txt
复制代码
sed.exe 4.1.4 下载:
http://bbs.bathome.net/thread-1114-1-1.html
作者: Batcher    时间: 2011-6-23 00:04

  1. gawk "$5!=9" a.txt | more >b.txt
复制代码
http://bbs.bathome.net/thread-1114-1-1.html
作者: xslxslxsl    时间: 2011-6-23 00:43

首先感谢楼上的高手辛苦指点,但是sed 的语法上我不是很理解,最好解释一下,谢谢,
gawk 基本上可以看懂,但是它生成的B.TXT中的数据间的分隔符变成空格了,原来是TAB键,望高手再指点一二。
继续等候中,谢谢!
作者: Batcher    时间: 2011-6-23 00:53

  1. gawk "$5!=9" a.txt >b.txt
复制代码

作者: tmplinshi    时间: 2011-6-23 10:45

本帖最后由 tmplinshi 于 2011-6-23 10:55 编辑
sed -i "/^.*\t\+.*\t\+.*\t\+.*\t\+9\t\+/d" *.txt

-i         直接修改文件
^         从行的开头匹配
.*        零个或零个以上任意字符
\t\+     一个或一个以上 tab 符号
d         删除匹配的行

解释完后才发现,会删除这样的行:
[Tab][Tab][Tab][Tab]9[Tab][Tab]

换成这样就不会:
  1. sed -i "/^.\+\t\+.\+\t\+.\+\t\+.\+\t\+9\t\+/d" *.txt
复制代码

作者: cjiabing    时间: 2011-6-23 11:19

findstr /v
作者: terse    时间: 2011-6-23 11:32

  1. @ECHO OFF
  2. For /f "delims=" %%a in ('dir /a-d /b abc*.txt') do (
  3.     (For /f "usebackq delims=" %%b in ("%%a") do (
  4.         For /f "tokens=5" %%c in ("%%b") do if %%c neq 9 echo %%b
  5.     ))>~tem
  6.     move ~tem "%%a"
  7. )
  8. pause
复制代码

作者: xslxslxsl    时间: 2011-6-23 22:08

谢谢大家的指点,但是
12        34        56        7        9        23
66        7        8        9        9        111
888        7        65        4        0        8
a        b2        6t        11        33        6       
a        b        c        6        9        i1
2                FF        3        7       
        33        55        6        9        9
                                        98
                                9        0
                                9       
55        66        8        8        90        768
这样的文本处理就有问题了,望高手继续指点,谢谢!
作者: tmplinshi    时间: 2011-6-23 22:17

9# xslxslxsl


看不出有多少个 tab,要么把 tab 换成其他字符,要么上传附件;
还有,贴一下要处理成什么结果。
作者: xslxslxsl    时间: 2011-6-23 22:20

12        34        56        7        9        23
66        7        8        9        9        111
888        7        65        4        0        8
a        b2        6t        11        33        6       
a        b        c        6        9        i1
2                FF        3        7       
        33        55        6        9        9
                                        98
                                9        0
                                9       
55        66        8        8        90        768

这样的文本处理就有问题了,麻烦高手指点,谢谢!
作者: CrLf    时间: 2011-6-23 22:43

本帖最后由 zm900612 于 2011-6-23 22:48 编辑
  1. @echo off
  2. for /f "tokens=1*delims=:" %%a in ('
  3.    findstr /bvrc:"[0-Z]*[^0-Z][0-Z]*[^0-Z][0-Z]*[^0-Z][0-Z]*[^0-Z]9\>" *.txt^&del /f /q *.txt>nul
  4. ) do echo>>%%a %%b
复制代码

作者: tmplinshi    时间: 2011-6-23 23:00

  1. sed -i "/^.*\t.*\t.*\t.*\t9\t/d" ABC*.txt
复制代码

作者: xslxslxsl    时间: 2011-6-23 23:05

好像,sed -i "/^.*\t\+.*\t\+.*\t\+.*\t\+9\t\+/d" *.txt
还是可以的哦
作者: xslxslxsl    时间: 2011-6-23 23:12

不好意思,刚才没有刷新页面,没有注意到大家的回复,对不起,我刚才将附件上传了,望大家指点,谢谢!
作者: xslxslxsl    时间: 2011-6-23 23:17

版主的可以的,非常感谢,谢谢你的耐心指导,同时也非常感谢其他高手的指点,谢谢了,大家真的好热情啊。
作者: xslxslxsl    时间: 2011-6-23 23:34

如果仅留下来第五列为9的行,删除其余的行,又如何书写代码呢?
作者: tmplinshi    时间: 2011-6-24 11:49

17# xslxslxsl


加一个感叹号:
sed -i "/^.*\t.*\t.*\t.*\t9\t/!d" ABC*.txt

作者: xslxslxsl    时间: 2011-6-24 12:23

哦,好的,谢谢版主哦,我去试试




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2