file1
다음 내용을 포함하는 두 개의 파일이 있다고 가정합니다 .
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
. 첫 번째 열은 파일 이름이 되고
, 두 번째 열은 "설명 점수"가 되며, 세 번째 열은 아래와 같이 "설명 점수"가 됩니다. .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
여기서는 행이 각 테스트에서 항상 다섯 번째 행이라고 가정합니다 .
답변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
. 사용된 특정 데이터 구조는 배열 해시입니다. 이는 각 요소가 하나 이상의 값을 포함하는 목록(즉, 배열)인 해시 배열입니다.
정규식과 일치하는 줄이 있고 비어 있지 않으면 /Interpretation Score/
해석 점수를 추출하여 에 포함된 배열에 푸시합니다 . 그런 다음 잘못된 데이터가 키에 추가되는 것을 방지하기 위해 삭제합니다 .$filename
split()
$wavfiles{$filename}
$filename
더 이상 읽을 입력이 없으면 %wavfiles
배열 해시의 내용을 CSV 형식으로 인쇄합니다.
스크립트는 모든 크기의 입력 파일 수를 처리할 수 있습니다. 명령줄에 지정된 모든 파일 이름 및/또는 stdin에서 전달된 모든 데이터를 하나의 입력 스트림으로 처리합니다.
입력 순서는 중요합니다. 이는 점수가 출력에서 해석되는 순서에 직접적인 영향을 미칩니다(예: 55 앞에 567이 표시되면 해당 값이 표시되는 순서입니다. 반대의 경우도 마찬가지입니다).
스크립트는 파일 이름당 두 개의 해석 점수로 제한되지 않습니다. 각 파일 이름에 대해 표시되는 해석 점수를 표시되는 순서대로 쉼표로 구분하여 인쇄합니다.
#! /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