私はPerlに初めて触れました。配列を抽出して下の列に印刷する必要があります。難しい部分は、各単語が異なるサウンドタイプ(PまたはSで指定)を持ち、各タイプが対応するサウンドと音節の形に関連付けられていることです。
array []を使って抽出してみましたが、コードはかなり長いです。これをエンコードするより効率的な方法はありますか?
入力(データはcelex corpusにあります)。以下は、数千行の例です。
31259\open\635\3\P\5-p@n\[VV][CVC]\[@U][p@n]\P\5-pH\[VV][CS]\[@U][pn,]\S\5-pF\[VV][CS]\[@U][pm,]
........
........
私の出力は次のようになります。
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]
...
...
答え1
.
その背後にあるかどうかを確認する方法がわかりませんが、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: $!";
答え2
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()との唯一の違いは、最初の要素がPerlにあるi=5
ことです。$i=4
$c[0]