问题
I am newbie in TCL scripting. Just wish to get some advice from experts here.
I wish to process the report with format as below. I am thinking to print the report without the header and with just single line like -
Connections for net 'pmg_ccu_ot2_tam_50mhz_sel_xainfwh' :: Driver a_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh Output Pin (a_par) :: Load b_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh Input Pin (b_par)
Connections for net 'pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2' :: Driver d_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2 Output Pin (d_par) :: Load e_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2 Input Pin (e_par), f_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_3 Input Pin (f_par)
<more . . .>
Really appreciate if anyone can give some light and idea to me. Thanks much!
****************************************
Report : net
-connections
Design : soc
Version: G-2012.06-SP2
Date : Sun Apr 7 22:56:33 2013
****************************************
Connections for net `pmg_ccu_ot2_tam_50mhz_sel_xainfwh`:
Driver Pins Type
------------ ----------------
a_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh Output Pin (a_par)
Load Pins Type
------------ ----------------
b_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh Input Pin (b_par)
1
Connections for net `pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2`:
Driver Pins Type
------------ ----------------
d_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2 Output Pin (d_par)
Load Pins Type
------------ ----------------
e_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_3 Input Pin (e_par)
f_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_3 Input Pin (f_par)
1
<more . . .>
回答1:
If I'm understanding your requirements correctly, I would do something like this:
Input file contains:
****************************************
Report : net
-connections
Design : soc
Version: G-2012.06-SP2
Date : Sun Apr 7 22:56:33 2013
****************************************
Connections for net `pmg_ccu_ot2_tam_50mhz_sel_xainfwh`:
Driver Pins Type
------------ ----------------
a_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh Output Pin (a_par)
Load Pins Type
------------ ----------------
b_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh Input Pin (b_par)
1
Connections for net `pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2`:
Driver Pins Type
------------ ----------------
d_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2 Output Pin (d_par)
Load Pins Type
------------ ----------------
e_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_3 Input Pin (e_par)
f_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_3 Input Pin (f_par)
1
<more . . .>
The script:
# Read file containing input
set inputfile [open "inputfile.txt" r]
# File where output will be written in
set outputfile [open "outputfile.txt" w]
# $type will contain the Pin Type and $outputline will contain the final
# line to be written
set type ""
set outputline ""
# Read each line in the inputfile
while {[gets $inputfile line] != -1} {
# If first word in line is "Connections" execute
if {[lindex [split $line " "] 0] == "Connections"} {
# If $outputline not empty while in this if, it means that we have
# reached a new connection. So print out the current connection
# after joining all its elements by " :: " and reset the output line.
if {$outputline != ""} {
puts $outputfile [join $outputline " :: "]
set outputline ""
}
# Replacing the ` by ' and removing the end ":" and then putting
# the full thing into $output line as an element of a list
regsub -all {\`} $line "\'" newline
set newline [string trimright $newline "\:"]
lappend outputline $newline
}
# If there is "Pins" in the line, this means we have a header. The regexp
# captures the pin type by looking for any alphanumeric characters before
# "Pins"
regexp -- {([\w]+) Pins} $line - type
# If there is " Pin " in the line, it means we are in a row of the
# different 'Pins' type. Here, we put the while line after removing
# the extra white spaces into the $outputline list.
if {[regexp -- { Pin } $line]} {
lappend outputline "$type [string trim $line]"
}
}
# We reached the end of the document. So, add the last line into the outputfile.
puts $outputfile [join $outputline " :: "]
# Close the files we opened.
close $inputfile
close $outputfile
The output:
Connections for net 'pmg_ccu_ot2_tam_50mhz_sel_xainfwh' :: Driver a_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh Output Pin (a_par) :: Load b_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh Input Pin (b_par)
Connections for net 'pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2' :: Driver d_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2 Output Pin (d_par) :: Load e_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_3 Input Pin (e_par) :: Load f_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_3 Input Pin (f_par)
This script will take 'Driver Type' or 'Load Type' in any order they come (and you can add new types as well). Are there any other possible variations in your in your input?
EDIT: You can change the switch block into this and it will take any type of Pins
if {[regexp -- {([\w]+) Pins} $line - type]} {
set counter 0
}
reEDIT: Added -- to the regexp.
rereEDIT: Matched edit in question.
来源:https://stackoverflow.com/questions/15872408/process-multiple-lines-text-file-to-print-in-single-line