awk에서 두 파일의 데이터를 병합하는 방법

awk에서 두 파일의 데이터를 병합하는 방법

두 개의 파일 이 있습니다 A.txt.B.txt

A.txt(9월 = \t):

Well    Sample Name Target Name Task    Reporter
A1  B1000-1 MS2 UNKNOWN JUN 
A1  B1000-1 Ngene   UNKNOWN VIC 
A1  B1000-1 ORF1ab  UNKNOWN FAM 
A1  B1000-1 Sgene   UNKNOWN ABY 
A2  B500-3  MS2     UNKNOWN JUN 
A2  B500-3  Ngene   UNKNOWN VIC 
A2  B500-3  ORF1ab  UNKNOWN FAM

및 B.txt(9월 = ;)

kit;;;;;;;
Software Version = cti;;;;;;;
Date And Time of Export = 06/02/20  14:14:11;;;;;;;
Experiment Name = taq;;;;;;;
Instrument Software Version = ;;;;;;;
Instrument Type = sds7500fast;;;;;;;
Instrument Serial Number = ;;;;;;;
Run Start Date = Tue Jun 02 12:00:40 CEST 2020;;;;;;;
Run End Date = Tue Jun 02 13:14:42 CEST 2020;;;;;;;
Run Operator = FE;;;;;;;
Batch Status = VALID;;;;;;;
;;;;;;;
Date And Time of Export;Batch ID;Sample Name;Well;Sample Type;Status;Interpretive;Action*;Cт
06/02/2020 14:14;020620 TAQPATH BIS;B50-1-KF;H2;Patient;VALID;SARS-CoV-2 Not Detected;REPORT;29.2525;Undetermined;16.0231;33.9412

출력 파일에서 이것을 얻고 싶습니다 C.txt.

kit;;;;;;;
Software Version = cti;;;;;;;
Date And Time of Export = 06/02/20  14:14:11;;;;;;;
Experiment Name = taq;;;;;;;
Instrument Software Version = ;;;;;;;
Instrument Type = sds7500fast;;;;;;;
Instrument Serial Number = ;;;;;;;
Run Start Date = Tue Jun 02 12:00:40 CEST 2020;;;;;;;
Run End Date = Tue Jun 02 13:14:42 CEST 2020;;;;;;;
Run Operator = FE;;;;;;;
Batch Status = VALID;;;;;;;
;;;;;;;
Date And Time of Export;Batch ID;Sample Name;Well;Sample Type;Status;Interpretive;Action*;MS2;Ngene;ORF1ab;Sgene
06/02/2020 14:14;020620 TAQPATH BIS;B50-1-KF;H2;Patient;VALID;SARS-CoV-2 Not Detected;REPORT;29.2525;Undetermined;16.0231;33.9412

A1A.txt그래서 in 으로 시작하는 행을 필터링 하고 해당 행의 세 번째 필드를 행 13 의 9번째 필드로 복사하고 싶습니다 B.txt.

다른 FNR==NR로 몇 가지 테스트를 수행했지만 결정적인 결과는 없었습니다.

감사해요

답변1

한 가지 방법은 다음과 같습니다.

$ awk -F'[;\t]' '{if(NR==FNR){if($1=="A1"){s==""?s=$3:s=s";"$3;}}else{if(FNR==13){$9=s;}OFS=";";print}}' A.txt B.txt 
kit;;;;;;;
Software Version = cti;;;;;;;
Date And Time of Export = 06/02/20  14:14:11;;;;;;;
Experiment Name = taq;;;;;;;
Instrument Software Version = ;;;;;;;
Instrument Type = sds7500fast;;;;;;;
Instrument Serial Number = ;;;;;;;
Run Start Date = Tue Jun 02 12:00:40 CEST 2020;;;;;;;
Run End Date = Tue Jun 02 13:14:42 CEST 2020;;;;;;;
Run Operator = FE;;;;;;;
Batch Status = VALID;;;;;;;
;;;;;;;
Date And Time of Export;Batch ID;Sample Name;Well;Sample Type;Status;Interpretive;Action*;MS2;Ngene;ORF1ab;Sgene
06/02/2020 14:14;020620 TAQPATH BIS;B50-1-KF;H2;Patient;VALID;SARS-CoV-2 Not Detected;REPORT;29.2525;Undetermine

또는 읽기가 더 쉽습니다.

awk -F'[;\t]' '{
     if(NR==FNR){
        if($1=="A1"){
           if(s==""){ s=$3 }
           else{ s=s";"$3 }
         }
     else{
        if(FNR==13){ $9=s; } 
          OFS=";"; 
          print
        }
     }' A.txt B.txt > C.txt

설명하다:

  • -F'[;\t]': 두 파일을 모두 올바르게 읽을 수 있도록 ;필드 구분 기호를 or로 설정합니다 . \t알아채다이는 no ;in fileA과 no \tin을 가정합니다.fileB.
  • if(NR==FNR){: 첫 번째 파일을 읽는 경우.
  • if($1=="A1"){: 첫 번째 필드가 A1.
  • s==""?s=$3:s=s";"$3;: 변수 s가 비어 있으면 값으로 설정합니다 $3. 비어 있지 않으면 a를 추가한 ;다음 를 추가합니다 $3. 그러면 에 삽입하려는 문자열이 작성됩니다 B.txt.
  • else {: 두 번째 파일을 읽는 경우(완료되었습니다 if(NR==FNR)).
  • if(FNR==13){ $9=s; }: 현재 파일의 13번째 라인이라면 9번째 필드를 값으로 설정합니다 s.
  • OFS=";"; print: 두 번째 파일의 모든 줄을 인쇄하고 싶지만 ;올바르게 인쇄하려면 필드 구분 기호를 출력해야 합니다.

관련 정보