여러 파일의 awk에서 템플릿의 데이터를 인쇄하는 방법

여러 파일의 awk에서 템플릿의 데이터를 인쇄하는 방법

기본 파일이 있습니다 A.txt(필드 구분 기호 = \t).

Sample ID   Internal Control    Result  Consensus Sequence  Lane    Index Set   Index ID
2154686427  Pass    Detected    Not Available   1,2,3,4 1   UDP0001
2154666275  Pass    Detected    Not Available   1,2,3,4 1   UDP0002

2154686427.mapping_metrics.csv각 샘플에는 여기 및 2154666275.mapping_metrics.csv(필드 구분 기호 = ,)와 같은 동일한 측정항목이 포함된 파일이 있습니다 . 2154686427.mapping_metrics.csv:

MAPPING/ALIGNING SUMMARY,,Total input reads,5654101,100.00
MAPPING/ALIGNING SUMMARY,,Number of duplicate marked reads,5577937,98.65

그리고 2154666275.mapping_metrics.csv:

MAPPING/ALIGNING SUMMARY,,Total input reads,5651111,100.00
MAPPING/ALIGNING SUMMARY,,Number of duplicate marked reads,5511111,97.2

A.txt다음과 같이 각 파일의 제목($3)과 해당 값($4)을 인쇄하고 싶습니다 .

Sample ID   Internal Control    Result  Consensus Sequence  Lane    Index Set   Index ID    Total input reads   Number of duplicate marked reads
2154686427  Pass    Detected    Not Available   1,2,3,4 1   UDP0001 5654101 5577937
2154666275  Pass    Detected    Not Available   1,2,3,4 1   UDP0002 561111  5511111

이 일을 할 생각이 있나요?

파일 이름 유사성을 기반으로 유사한 질문을 검색해 보았지만 아무것도 찾지 못했습니다. 감사해요

답변1

awk -v OFS="\t" -F, '
  FS==","{
     hdr[FNR]=$3                         # save header in array
     sub(/\..*/, "", FILENAME)           # remove `.mapping_metrics.csv` from FILENAME
     sub(/.*\//, "", FILENAME)           # remove parent path from FILENAME
     val[FILENAME]=val[FILENAME] OFS $4  # append value to array using tab as separator
     next
  }
  FNR==1{
    print $0 OFS hdr[1] OFS hdr[2]       # print header and new header fields
    next
  }
  { print $0 val[$1] }                   # print record with new values
' *.mapping_metrics.csv FS="\t" A.txt

답변2

awk -F '\t' '
  BEGIN { OFS = FS; ORS = "" }
  NR==1 {
    h1 = "Total input reads"
    h2 = "Number of duplicate marked reads"
    print $0, h1, h2 RS
    next
  }
  {
    print
    FS = ","
    f = $1 ".mapping_metrics.csv"
    while (getline < f > 0)
      if ((h1==$3)||(h2==$3))
        print "", $4
    print RS
    close(f)
    FS = OFS
  }
' ./A.txt

헤더의 마지막 두 필드는 하드코딩될 수 있다고 가정합니다.

관련 정보