file1
次の内容を含む2つのファイルがあるとします。
message_aaa.wav テスト1(合計1個) テストタグ:aaa テスト文:テストaaa テスト文字列:テストメッセージ 通訳スコア:567 message_bbb.wav テスト1(合計1個) テストタグ:bbb テスト文:bbbテスト テスト文字列:テストbbb 通訳スコア: 972 Message_ccc.wav テスト1(合計1個) テストタグ:ccc テストドア:ccc テスト文字列:cccテスト 通訳スコア: 921
file2
以下の内容があります。
message_aaa.wav テスト1(合計1個) テストタグ:aaa テスト文:テストaaa テスト文字列:テストメッセージ 通訳スコア:55 message_bbb.wav テスト1(合計1個) テストタグ:bbb テスト文:bbbテスト テスト文字列:テストbbb 通訳スコア: 34 message_ccc.wav テスト1(合計1個) テストタグ:ccc テストドア:ccc テスト文字列:cccテスト 通訳スコア:12
CSV
3つの列がある/ファイルを作成したいと思いますxls
。最初の列はファイル名になり
、2番目の列は「説明スコア」になり、3番目の列は以下のように「説明スコア」になります。 .wav
file1
from file1
from file2
message_aaa.wav,567,55
message_bbb.wav,972,34
message_ccc.wav,921,12
答え1
このようなawk
:
awk '/^[mM]essage_.*.wav/{
n=NR+5;i=tolower($1)
}
n==NR{
a[i]=a[i]","$4
}
END{
for ( i in a){
print i""a[i]
}
}' file1 file2
行が(値がある行番号)に設定された[mM]essage_.*.wav
変数で始まり、wavファイル名が変数aに格納されます。n
NR+5
Interpretation Score
i
index asに配列を作成するときは、n==NR
配列に($ 4)を追加します。i
Interpretation Score
END
必要に応じて、すべての配列インデックスとその値を印刷します。
Interpretation Score
ここでは、行が各テストで常に5番目の行であると仮定します。
答え2
grep -e 'wav\|Inter' file1.txt | cut -d: -f2 | awk '{print $1}'| awk 'NR%2{printf $0",";next;}1' > file1new.txt
grep -e 'wav\|Inter' file2.txt | cut -d: -f2 | awk '{print $1}'| awk 'NR%2{printf $0",";next;}1' > file2new.txt
join -t, file1new.txt file2new.txt
答え3
以下は、タスクを実行するPerlスクリプトです。標準入力を読み込み、ファイル名を抽出するというハッシュ配列のキーとして使用します%wavfiles
。使用される特定のデータ構造は配列ハッシュです。これは、各要素が1つ以上の値を含むリスト(つまり配列)であるハッシュ配列です。
正規表現に一致する行があり、空でない場合は、/Interpretation Score/
解釈スコアを抽出してに含まれる配列にプッシュします。次に、誤ったデータがキーに追加されないように削除します。$filename
split()
$wavfiles{$filename}
$filename
読み取る入力がない場合は、%wavfiles
配列ハッシュの内容をCSV形式で印刷します。
スクリプトは任意のサイズの入力ファイル数を処理できます。コマンドラインで指定されたすべてのファイル名および/またはstdinから渡されたすべてのデータを1つの入力ストリームとして処理します。
入力順序は重要です。これは、スコアが出力で解釈される順序に直接影響します(たとえば、55の前に567が表示されている場合はその値が表示される順序です。逆の場合も同様です)。
スクリプトは、ファイル名ごとに2つの解釈スコアに制限されません。各ファイル名に対して表示される解釈スコアを、表示される順にカンマで区切って印刷します。
#! /usr/bin/perl
use strict;
my %wavfiles = ();
my $filename = '';
while(<>) {
chomp; # strip line-feed from end of line
$filename = $_ if (m/\.wav$/);
if ((m/Interpretation Score/) && (! -z $filename)) {
my (undef,$score) = split /: /; # split input line on ': '
push @{ $wavfiles{$filename} }, $score;
$filename = '';
};
}
foreach $filename (keys %wavfiles) {
print "$filename,", join(",",@{ $wavfiles{$filename} }),"\n";
}
サンプル入力を使用した出力は次のとおりです。
$ ./interpscore.pl file1 file2
message_bbb.wav,972,34
Message_ccc.wav,921
message_aaa.wav,567,55
message_ccc.wav,12
ハッシュキーはファイル名と同様に大文字と小文字を区別するため、入力ファイル内のMessage_ccc.wav
(大文字-M)と(小文字-m)のエントリがあります。message_ccc.wav
ファイル名を一貫して作成するには、入力ファイルを編集する必要があります。これを行うと、出力は次のようになります。
$ ./interpscore.pl file1 file2
message_aaa.wav,567,55
message_ccc.wav,921,12
message_bbb.wav,972,34