TCL-REGEX ::如何使用TCL regexp过滤在文本文件中多次出现的行

时间:2014-08-05 07:55:50

标签: regex tcl expect

输入文件(resultnew.txt):

www.maannews.net.

www.maannews.net.

 ################################################# 

attach2.mobile01.com.

www.google-analytics.

attach2.mobile01.com.

attach2.mobile01.com.

www.google-analytics.

attach2.mobile01.com.

attach2.mobile01.com.

attach2.mobile01.com.

attach2.mobile01.com.

attach2.mobile01.com.

www.google.com.

attach2.mobile01.com.

attach2.mobile01.com.

attach2.mobile01.com.

 ################################################# 

cdn-img.mocospace.com

cdn-img.mocospace.com

www.mocospace.com.

cdn-img.mocospace.com

cdn-img.mocospace.com

cdn-img.mocospace.com

www.mocospace.com.

cdn-img.mocospace.com

www.mocospace.com.

www.google-analytics.

www.google-analytics.

fonts.gstatic.com.

cdn-img.mocospace.com

cdn-img.mocospace.com

fonts.gstatic.com.

fonts.gstatic.com.

 ################################################# 

我的TCL脚本:

set a [open resultnew.txt r]
set b [open balu_output.txt w]


while {[gets $a a1] >=0} {
    if {[regexp {[a-zA-Z\.]} $a1]} {
    puts $b $a1
    }
}

我的要求:

  1. 从上面的文本文件中,我想删除多次出现的行,并且只想打印一次到新文件中。
  2. 第1点应该在每个“#################”和“#################”之间发生。仍然“#################应出现在该文本文件中”。
  3. 请帮助我解决您的想法。提前谢谢。

    谢谢,

    Balu P。

2 个答案:

答案 0 :(得分:1)

您需要一种不同的方法来检查是否忽略行,并且数组很好以进行唯一性检查。这是一个带注释的版本:

# For each line in the input
while {[gets $a a1] >= 0} {
    # Get rid of extra spaces
    set a1 [string trim $a1]
    # Ignore empty and comment lines; [string match] is great for this!
    if {$a1 eq "" || [string match "#*" $a1]} {
        continue
    }
    # See if this is the first time we've seen a line
    if {[incr occurrences($a1)] == 1} {
        # It is! Print it now
        puts $b $a1
    }
}

如果你有一个非常大的文件,你最终可能会遇到内存使用问题。但是对于(最多)几百万行的文件,你应该没问题。

答案 1 :(得分:1)

我从你的问题中理解的是,你需要在评论行之间有明显的价值(即hashess ......)。下面是您正在寻找的解决方案...基本上在脚本数组键中用于保留唯一值并在下一个分隔线(即看到您的哈希注释行)时重新初始化数组...

我在STDOUT上打印了值,您可以将它们重定向到其他文件。

#!/usr/bin/tclsh
set a [open resultnew.txt r]

# set an array to keep the unique records
array set myarray {}

# For each line in the input
while {[gets $a a1] >= 0} {

    # Get rid of extra spaces
    set a1 [string trim $a1]

    # if divider line found then print it (i.e ####)
    if { [string match "#*" $a1] } {
      puts $a1
      # unset the array for next set of entries
      array unset myarray
    } else {
      # Ignore empty lines
      if {$a1 ne "" }  {
        # print only if doesnot exists in the array
        if { [info exists myarray($a1) ] } {
          set myarray($a1) 1 
        } else {
          puts $a1
          set myarray($a1) 1
        }
     }
  }
}

使用输入文件输出脚本

$tclsh main.tcl
www.maannews.net.
#################################################
attach2.mobile01.com.
www.google-analytics.
www.google.com.
#################################################
cdn-img.mocospace.com
www.mocospace.com.
www.google-analytics.
fonts.gstatic.com.
#################################################