Извлечь массивы с соответствующими совпадениями

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по мере необходимости.

0
10.11.2019, 19:53
2 ответа

Не знаю, как определить, есть ли .после 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: $!";
0
28.01.2020, 03:08

Я немного упростил 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.

0
28.01.2020, 03:08

Теги

Похожие вопросы