Board logo

标题: [文本处理] 批处理如何提取文本中指定内容的上一行数据? [打印本页]

作者: Rasm    时间: 2017-3-25 11:05     标题: 批处理如何提取文本中指定内容的上一行数据?

本帖最后由 Rasm 于 2017-3-26 11:24 编辑

原始数据:
  1. 0008wf|feifei
  2. 002king|3270501
  3. 007sh|youhua007
  4. 00boy00|3984472
  5. 0410zxasqw|lsk521
  6. 100014|123456789a
  7. 1000y|781126
  8. 1024yy|123456789
  9. 107559797|7758521
  10. 108799|357111
  11. 110321775|789789
复制代码
想提取以下文本内容的上一行数据到新文本:
  1. 002king|3270501
  2. 0410zxasqw|lsk521
  3. 107559797|7758521
复制代码
文件地址:https://share.weiyun.com/481a010f58993295b20d273c263e2ee3
作者: taofan712    时间: 2017-3-25 11:41

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in (a.txt) do (
  4. if not defined line ( set line=%%a) else (
  5. if "%%a"=="002king|3270501" echo;!line!
  6. if "%%a"=="0410zxasqw|lsk521" echo;!line!
  7. if "%%a"=="107559797|7758521" echo;!line!
  8. set line=%%a
  9. )
  10. )
  11. pause
复制代码

作者: Rasm    时间: 2017-3-25 12:34

回复 2# taofan712


    数据比较多,怎么导出到新的文本啊?
作者: zuodx    时间: 2017-3-25 12:49

#!/usr/bin/perl
use strict;

my @dst = qw(      
    002king|3270501   
    0410zxasqw|lsk521
    107559797|7758521
  );

my $line ;
my $prev = '';

while($line = <>)
{
   chomp  $line  and s/^\s+// and  s/\s+$// ;
   print "$prev\n" if ( grep ({$_ eq $line}   @dst ));
   $prev = $line;
}
作者: ShowCode    时间: 2017-3-25 13:14

回复 3# Rasm


(for ...
    ...
))>b.txt
作者: Rasm    时间: 2017-3-25 13:15

回复 5# ShowCode


    我要给你yes
作者: Rasm    时间: 2017-3-25 13:20

回复 2# taofan712


    400行数据,输出内容为空
作者: ShowCode    时间: 2017-3-25 13:26

回复 7# Rasm


    文件压缩一下传上来我试试
作者: taofan712    时间: 2017-3-25 16:30

回复 7# Rasm
  1. @echo off & setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (a.txt) do (
  3. if not defined line ( set line=%%a) else (
  4. for /f "delims=" %%b in (b.txt) do if "%%a"=="%%b" echo;!line!
  5. set line=%%a
  6. )
  7. ))>c.txt
  8. pause
复制代码
如果指定对比的行比较多,可以放进b.txt




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