두 개의 파일 이 있습니다 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
A1
A.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;
infileA
과 no\t
in을 가정합니다.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
: 두 번째 파일의 모든 줄을 인쇄하고 싶지만;
올바르게 인쇄하려면 필드 구분 기호를 출력해야 합니다.