sed, awk 또는 bash 스크립트를 사용하여 Linux에서 다음 형식을 수행하는 방법

sed, awk 또는 bash 스크립트를 사용하여 Linux에서 다음 형식을 수행하는 방법


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

CSV3개의 열이 있는 / 파일을 만들고 싶습니다 xls. 첫 번째 열은 파일 이름이 되고
, 두 번째 열은 "설명 점수"가 되며, 세 번째 열은 아래와 같이 "설명 점수"가 됩니다. .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여기서는 행이 각 테스트에서 항상 다섯 번째 행이라고 가정합니다 .

답변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/해석 점수를 추출하여 에 포함된 배열에 푸시합니다 . 그런 다음 잘못된 데이터가 키에 추가되는 것을 방지하기 위해 삭제합니다 .$filenamesplit()$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

관련 정보