Вывести имя файла и подстроку в CSV для каждого файла в каталоге, - PullRequest
0 голосов
/ 28 февраля 2020

Я пытался научить себя awk выполнению sh следующего, но не добился большого успеха.

У меня есть каталог с несколькими текстовыми файлами:

JV-01_S01_L007_R2_002_RepetitiveText_ToRemove.txt
JV-26_S48_L_RepetitiveText_ToRemove.txt
...

Структура каждого текстового файла следующая. Числа могут измениться , но сопровождающий текст всегда останется неизменным.

JV-01_S01_L007_R2_002_RepetitiveText_ToRemove.txt

4620178 reads; of these:
  4620178 (100.00%) were unpaired; of these:
    1226814 (26.55%) aligned 0 times
    3040861 (65.82%) aligned exactly 1 time
    352503 (7.63%) aligned >1 times
73.45% overall alignment rate

JV-26_S48_TeTeRet .txt

1601831 reads; of these:
  1601831 (100.00%) were unpaired; of these:
    58800 (3.67%) aligned 0 times
    1344724 (83.95%) aligned exactly 1 time
    198307 (12.38%) aligned >1 times
96.33% overall alignment rate

Для каждого файла в этом каталоге я хочу скомпилировать csv:

Sample                  Total_Reads Uniquely_Mapped_Reads   Multi_Mapped_Reads  Unmapped_Reads
JV-01_S01_L007_R2_002   4620178     3040861                 352503              1226814
JV-26_S48_L             1601831     1344724                 198307              58800
...

Есть ли способ сделать это с помощью сингла для l oop с awk? Я пытался использовать функцию соответствия. Например, если бы я мог указать поиск совпадений в указанной строке c, а затем искать слева направо подстроку, состоящую из любого числа цифр, до тех пор, пока не будет найден пробел. Это захватило бы подстроку, представляющую интерес для этой строки.

Что-то вроде:

for file in *.txt
do
  awk 'FNR == 1 {print FILENAME, match(NR==1, \d), match(NR==4, \d), match(NR==5, \d), match(NR==3, \d) } ' $file >> Names.csv

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Вот простой способ, , но для него требуется GNU awk для нескольких символов RS .

Файл можно прочитать как одну запись, используя трюк здесь, Тогда вам просто нужно распечатать поля, которые вы хотите (и это зависит от вашего утверждения, что текст исправлен)

$ awk -v RS="^$" '{print FILENAME, $1, $16, $22, $11}' jv-01 jv-26
jv-01 4620178 3040861 352503 1226814
jv-26 1601831 1344724 198307 58800
1 голос
/ 28 февраля 2020

Не могли бы вы попробовать следующие, написанные и протестированные с показанными образцами.

awk '
BEGIN{
  print "Sample                  Total_Reads Uniquely_Mapped_Reads   Multi_Mapped_Reads  Unmapped_Reads"
}
FNR==1{
  if(total_reads){
    print file,total_reads,Uniquely_Mapped_Reads,times,Multi_Mapped_Reads,Unmapped_Reads
  }
  total_reads=Uniquely_Mapped_Reads=times=Multi_Mapped_Reads=Unmapped_Reads=""
  sub(/_RepetitiveText.*/,"",FILENAME)
  file=FILENAME
}
/reads; of these/{
  total_reads=$1
  next
}
/aligned exactly 1 time/{U
  niquely_Mapped_Reads=$1
  next
}
/aligned >1 times/{
  Multi_Mapped_Reads=$1
  next
}
/aligned [0-9]+ times/{
  Unmapped_Reads=$1
}
END{
  if(total_reads){
    print file,total_reads,Uniquely_Mapped_Reads,times,Multi_Mapped_Reads,Unmapped_Reads
  }
}
'  *.txt | column -t
...