sed、awk、またはbashスクリプトを使用してLinuxで次の形式を実行する方法

sed、awk、またはbashスクリプトを使用してLinuxで次の形式を実行する方法


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

CSV3つの列がある/ファイルを作成したいと思いますxls。最初の列はファイル名になり
、2番目の列は「説明スコア」になり、3番目の列は以下のように「説明スコア」になります。 .wavfile1
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に格納されます。nNR+5Interpretation Scorei

index asに配列を作成するときは、n==NR配列に($ 4)を追加します。iInterpretation 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/解釈スコアを抽出してに含まれる配列にプッシュします。次に、誤ったデータがキーに追加されないように削除します。$filenamesplit()$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

関連情報