首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在awk中组合来自两个文件的数据

如何在awk中组合来自两个文件的数据
EN

Unix & Linux用户
提问于 2020-06-11 09:49:22
回答 1查看 45关注 0票数 1

我有两个文件,A.txtB.txt

A.txt (sep = \t):

代码语言:javascript
复制
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 (sep = ;)

代码语言:javascript
复制
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中得到这个结果:

代码语言:javascript
复制
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

因此,我想在A.txt中筛选以D7开头的行,并将这些行的第三个字段复制为B.txt第13行的第9个字段。

我用不同的FNR==NR做了一些测试,但没有定论。

谢谢

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-06-11 10:29:23

有一种方法:

代码语言:javascript
复制
$ 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

或者,读起来容易一点:

代码语言:javascript
复制
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]':这将字段分隔符设置为;\t,这样我们就可以正确读取两个文件。请注意,this假定 ; <#>在 fileA and中不存在 \t <#>fileB
  • if(NR==FNR){:如果我们正在读取第一个文件。
  • if($1=="A1"){:如果第一个字段是A1
  • s==""?s=$3:s=s";"$3;:如果变量s为空,则将其设置为$3的值。如果它不是空的,那么添加一个;,然后添加$3。这将构建我们想要插入到B.txt中的字符串。
  • else {:如果我们正在读取第二个文件(这就完成了if(NR==FNR))。
  • if(FNR==13){ $9=s; }:如果这是当前文件的第13行,那么将第9个字段设置为s的值。
  • OFS=";"; print:我们希望打印第二个文件中的所有行,但是我们需要输出字段分隔符为;,以便正确地打印它们。
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/592240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档