TCL может легко включать и запускать команды из какого-либо другого файла; например, командаsource(n)
позволяет сказать
#!/usr/bin/env expect
package require Tcl 8.5
set IP [lindex $argv 0]
set include_file [lindex $argv 1]
#... begin commands before here
catch {source $include_file} result options
if {[dict get $options -code] != 0} {
puts stderr "could not source $include_file: $result"
exit 1
}
# end commands after here...
с этим сохраненным как runner
можно получить включаемый файл
$ cat runthese
puts a
puts b
puts c
$ expect runner 127.0.0.1 runthese
a
b
c
$
хотя, конечно, runthese
или любой другой файл, который нужно включить, может вместо этого иметь send
и expect
по мере необходимости.
Не знаю, как определить, есть ли .
после P
, но если предположить, что это все группы из 4 элементов и заголовок из 5 элементов, как насчет решения awk
?
awk -F '\' 'BEGIN{ print "WordForm Frequency Type Pronunciation Syllableshape"}{
for (i=5;i<=NF;i+=4) print $2, $3, $i, $(i+3), $(i+2)
}' file | column -t
Выход
WordForm Frequency Type Pronunciation Syllableshape
open 635 P [@U][p@n] [VV][CVC]
open 635 P [@U][pn,] [VV][CS]
open 635 S [@U][pm,] [VV][CS]
Редактировать
В соответствии с сообщением ниже, и просто для удовольствия (, потому что я никогда даже не смотрел на perl
для целей написания сценария до вчерашнего вечера )Я вбил вышеуказанный цикл в скрипт perl
, который, кажется, функция. Я уверен, что в приведенном ниже много неправильного, потому что он был собран с нуля без каких-либо знаний. Так что, если это ужасно плохое кодирование, пожалуйста, не комментируйте и не критикуйте, просто опубликуйте правильный способ сделать это и для моего образования.
#!/bin/perl
open(my $filehandle, '<', './file')
or die "Unable to open file, $!";
print "WordForm Frequency Type Pronunciation Syllableshape\n";
while (<$filehandle>) {
chomp($_);
@c = split (/\\/, $_);
for ($i=4;$i<=(@c-4);$i+=4) {
print "@c[1] @c[2] @c[$i] @c[$i+3] @c[$i+2]\n";
}
print "\n";
}
close($filehandle)
or warn "Unable to close the file handle: $!";
Я немного упростил perl-скрипт. Этот «скрипт» можно вызвать с помощью perl script file
.
print "WordForm Frequency Type Pronunciation Syllableshape\n";
while (<>) {
chomp;
@c = split(/\\/);
for ($i=4; $i<$#c; $i+=4) {
print "$c[1] $c[2]";
print " $c[$i] $c[$i+3] $c[$i+2]\n";
}
}
$i<$#c;
вместо$i<@c-4;
:я упустил, что «безопасность» минус 4 (имеет значение только в том случае, если рекорды побиты ).
$#c
- это массив @c
как скалярное значение, т.е. последний индекс.
Единственным отличием от awk(i=5
)является $i=4
, потому что первым элементом является $c[0]
в perl.