У меня есть основной файл 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

И я хочу напечатать заголовок (3 доллара) и соответствующее значение (4 доллара) каждого файла в A.txt, например:

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

У вас есть идея, как это сделать?

Я пытался найти похожую проблему на основе сходства FILENAME, но не нашел ее. Спасибо

-1
nstatam 10 Фев 2021 в 14:05

2 ответа

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
0
Freddy 11 Фев 2021 в 12:42
Спасибо за ваш ответ. Я пытаюсь запустить его, и в результате у меня есть только заголовок, который был добавлен к A.txt, а не соответствующее значение.
 – 
nstatam
10 Фев 2021 в 16:13
Вы также получаете исходные строки данных без новых значений или только заголовок?
 – 
Freddy
10 Фев 2021 в 16:27
У меня также есть исходные данные
 – 
nstatam
10 Фев 2021 в 16:30
Убедитесь, что префикс имен файлов *.csv соответствует идентификатору образца. sub(/\..*/, "", FILENAME) заменяет . и последующие символы пустой строкой, оставляя идентификатор образца, который должен соответствовать $1 из A.txt.
 – 
Freddy
10 Фев 2021 в 16:51
Я был осторожен в этом. Я обнаружил, что проблема в том, что файл *.csv должен находиться в том же каталоге, что и A.txt, потому что, если я напишу awk .... data/*.mapping_metrics.csv FS="\t" A.txt, скрипт не будет работать. Также новый вопрос, он печатает все значение файла; Я сделал подвыборку реального CSV-файла для своего примера. Итак, как я могу выбрать (или напечатать только те, у кого есть заголовок) значение, которое будет напечатано на A.txt? Спасибо
 – 
nstatam
11 Фев 2021 в 10:42
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

Предполагая, что последние два поля заголовка могут быть жестко запрограммированы.

0
guest_7 11 Фев 2021 в 14:02
Спасибо за ответ. Он работает, но печатает все значение CSV-файла; Я сделал подвыборку реального CSV-файла для своего примера. Итак, как я могу выбрать (или напечатать только те, у кого есть заголовок) значение, которое будет напечатано в A.txt? Спасибо
 – 
nstatam
11 Фев 2021 в 10:43
Я изменил код, чтобы позаботиться о требовании. Пожалуйста, проверьте.
 – 
guest_7
11 Фев 2021 в 12:37
Спасибо, что нашли время ответить мне. Я проверил код, и он печатает правильное значение для двух добавленных столбцов, но также печатает последнее значение в другой раз в следующем столбце; вот так: 6785952 6519341 6519341. Ты знаешь почему ?
 – 
nstatam
11 Фев 2021 в 13:41
Это означает, что ввод, который вы используете, отличается от того, что вы поделились здесь. Вы должны опубликовать то же самое.
 – 
guest_7
11 Фев 2021 в 14:08
Я дважды проверяю, и кажется, что ввод такой же, как представленный в теме.
 – 
nstatam
12 Фев 2021 в 10:42