Как добавить имя переменной при разделении файла fastq?

У меня есть файл fastq ниже, и я хочу разделить файл на lane=$2. Мой код выполняет работу по его разбиению, но я также хочу, чтобы к выходным файлам добавлялась переменная $SM. Может кто-нибудь, пожалуйста, дайте мне знать, что мне не хватает в моей команде?

SM="sample1"
awk 'BEGIN {FS = ":"} {lane=$2 ; print > "${SM}."lane".fastq" ; for (i = 1; i <= 3; i++) {getline ; print > "${SM}."lane".fastq"}}' < File.fastq

Файл.fastq

@HS2000-1015_160:7:1108:13370:100570/2
CTTGACTGCCAGAGACGCTCCTTTGCAATGCCTTCCGGTAACCAAATTTTTGGGCACAACACACAGCTGGCCTTCATTTCTTCAGGGGCTGGTAAACAGA
+
@@@ADFFFHHHFD=EF@:GHIIFHH<ECHGF@DDBB:6@D60?F=888)8='--(=5@EAE5?'(..((.;?@>>A>3;@####################
@HS2000-1015_160:5:2306:10070:71746/2
GAACCTCAAGGACTATTGGGAGAGCGGCGAGTGGGCCATCATCAAAGCCCCAGGCTACAAACACGACATCAAGTACAACTGCTGCGAGGAGATCTACCCC
+
@CCFFFFDHGHFHIJJJJJJGGGIIJJIGHI@FHGIIGHHEFGHHFFFFFBCDDDDDCDDDDDDDD;@BDCCDACDD@>ACCDDDDBDB<BA?C@CC@BD
@HS2000-1015_160:6:2116:4077:79041/2
GGTCCCCGCCTACGCCCACTGGGTTGGTGCACCTGGTGGTGGTGGCCGCCAAGAAGCTGGTGAACCGCCTCCAAGTGGCTCCCAAGACGCAGCTGGATGA
+
CCCFFFFFHHFHHJHJJJJJJJJGGHJHIGAGIIJIFHJ;@F;CHHFHFDDDDDCDDCDD9CCCDDBDDBBDDCDACDD8@BD3>?BCDBDDDACCDC@>
@HS2000-1015_160:5:2113:11446:94436/2
CGTCAGGGCCAACCCCGCCCCACCCTGACCCTACCTGGCACCCCTCACCTGTGGCCTGCCAGCACAGCCTCGCCCCTGCTGGCCAATGTGTCCCCCGTCA
+
?@@DA@DDFHH?DHI)<@@FHDBGGCHCBDH;DFA<)6.=7D;@CBCHD)).7@=>;?==AABC95<(5(5309@D########################
@HS2000-1015_160:6:2209:18284:44195/2
TAAAATGTCACAAAGCTGGAAACTCTTCCCTATCACAAACCAAAACTTAAAAGGACGTTACCTGGCTGGGTCTAAACTCCACATAACTCGCTTGCAGTTG
+
CCCFFFFEHHHGHJIIIJJIJJHIIJEHJJHIJJJIIJJIJIJJIJIIHJJIJGGHGHGIIHHIIIIHFH@DFFFDEEEECDDDCDDDDBDDBBDCDACC
@HS2000-1015_160:7:1215:18781:100685/2
ATAAAACAGTAAACAAAATAAAGTCAGTTTTTTTTTTTTTTTTTAAAGAACAAAATGAAACTTGAGGGAAAACTTCATGGAGTTACAGTTTATCCTGATA
+
CCCFFFFFHFHHFJJJJIIGIGI<CFHHIIJJJJJIJJHFDDD=ACC(38+9CB?:(>C(+:@>(4?05<?C?###########################
@HS2000-1015_160:6:1215:6292:43622/2
GGGTCCTGAGACCTGAGGGACCATTGGCCCTCTTCTGGCTTGCTTATCCTTTGTACCTGATGGCCAATGAATGTCAGAGATGGTCCTGTCTCCATCCAGT
+
BCCDFFFFHGHHHJJJIIJJJJJIJJJGIJIJJIHIIJJIEFHEIJJJJIGIGIIIIIJHFHIJJJJIHGHEC?BCEFFFEECCCEACCCCDDDDDDCCC
@HS2000-1015_160:7:2311:1291:4696/2
GATCTGGTGCTCGTATTCCATCCACCTCCCAAGCTATACATAATAACGGCCAAAGGACCTGGATGAAAGTGTCTGAAGCAGTTGTGTGTGTCTCACCTTC
+
?=?ABDDBCFDFHGGHBFCHHGD@GFDGCBDFGFFECCHHD@DDFHJEIIHGG3CE9C(7@E(.7=?;;@C?@ECA>@C3A(;A-5595<9:AC3@AC:A
@HS2000-1015_160:7:1205:18979:53766/2
TCTTGTTTTGACCAATAGTAAAGCACATTTCTCTAATTTGGATTTCTACAATATCCATATCTTGGTTTATGAAAGGTAGGGAAGAGACTTCAGGTACTGC
+
CCCFFDFFHHHHHIJIJJJIHIJHJJIJJJJIJIGIIIJJJJJHJIJJIJDHIJIIIIIJJJJIJGIJJJIIIGEEGCD@AHHFFEDFFCDDDDCCDD@C
@HS2000-1015_160:7:1205:5641:24287/2
ATAAGAAGGGAAGAATGATTAGGTGTCAAATGTTCTTTTTATTTTCTTTCAGTTCAATGCAAAAACTTTCCAGTGATTATGTAAATGCAGAATCATGTGG
+
CCCFFFFFHHHGHJIJJFJJGIGEHEHIJJJJGJGJJIJJJJJJJJJJJIJIIIJJJIJJIEHGIHGJJJJIGGGHIIIIEEEHCHHC>DFBEEA@CCCC
@HS2000-1015_160:7:1310:19879:73973/2
TTCTTGAGTTCTGATACCTGTTTCCACAATCGTTTCTGTTTCTGTTGTCTCCAGCCCATCCATGCTGTCCTCATCTTCCACTGCAGTTTTCACCCTACTT
+
@<@FFFDFHHH>FGGIJAEFHABHHIAGHAE=F@EF?FB@F:F<GGBGEHGGG9F=BGAGIIIHH;=.=CHG@CEHE3)7?=>)7@C>)(6(.6;A?ACC
@HS2000-1015_160:7:1215:4243:29984/2
ATCTACACCCAAAACAGAACTTTCACAAAAAAACTGTTGATACGAAGCTCATGAAAATCATGATGAATACTCCAACAATTAATGAATAAAACTATACAAT
+
;@@A;D;ADDFHFIIF3EG@A>ACEHE>EH=:DH@<9DB@F?B7C87'@)=)7@>@7==)7...).;?@C)6;((;(5;(>A:(:3;@3>:@>:@(4@::
@HS2000-1015_160:7:1314:6987:62989/2
ATAGCTGTCTGTTCAGAGTCTGATGTTTTCAGTAACACTCTTGATACATTAAGTGAGATAGAATGGAATCCAGCAACAAAGCTACTAAATCAGGTAACTT
+
C@CFFFFDHHHHHJIJJJBHHIIIIHJIJHGJIJJIEHGHJJIJJJJJJJJIGBGHHIJGHGIIHJJIJIIJIGIGHIGGGCHHHHBEFCCEFE>CCEEE
@HS2000-1015_160:6:1208:20370:97766/2
TTTACTTTTTCCCAAACAATAATGATGATAATGTGGCCATACTGGTGCATGAGGGCTCTTATTAAGGATAGGGGCCATGTCAGGCTCTATTGACTCCTAT
+
CCCFFFFFDHDFHJJJIJJJIIJGHJJJIIIIGHIJJIJJJIJIHIJJIIHGHIFHIFHJGIJJIJJJJJJJJHHHFFFFFEEEEEDDCDEDDDDDDCDD
@HS2000-1015_160:6:1108:20693:2521/2
CCCATTTTCTGATGAGGAAACAGGATCAGGGACATTGAGACCTACCAAAGTTACATAATACCAGTAGTAGAAATGGGACTTCAACACAGGCCTCTTGACT
+
7@@DDDDDHHHBDIGIB@F?A+AF@3+2AFE@1:BFE??HH6?BG9BD99??F49BC=88=:;F8=77/@EH=EHF9)=A>C>7?;(6@???C?>@####
@HS2000-1015_160:6:1206:11472:64908/2
AGTTTGTTGGACATTTGAGACCCCAGGAAATCCCCTTTCTCGTAACGTTCTCCGCTTGGATCTGATCTCAACAGGGTGTCGTAGTCATTCTTCAGCACAA
+
B@BDFFFFHHHHHIJGIIJIJJIJJJJGEGHHIJJJJJJIJIFFHIIHCHHIJJJGIIJH:CHHFFFFFFFEEEDD=@BDDDAB@DCDDDDDDD>CCB<?
@HS2000-1015_160:7:1114:4995:49287/2
CCTCCGCTCAGCACTGGCATTGGCATCGGTTTCTATGGCAACAGTGAGACCAGTGATGGGGTGTCCCAGCTCAGCTCTGCGCTGCTGCACGCCAACCACA
+
BCCFDFFFHHHHHJJJJJGHEIIJHIGIIFGHGIIIGHEHIIJJDHIJJJJJJEGIGGIDE:?BCEEAE@CCDCDDCDDDDDDDBCCDDD85?9BB@BDD
@HS2000-1015_160:7:1206:16723:26612/2
TTAGATATGCTGTATGTGAAGAAGAGGAGGTTAAAGAACACTGTTTTATGTAAATGTCTCATTCCTTATCCTACAGAAATTGCATTTTTAATTAAATCTT
+
BC@FFFFFHHHHHICIGGHEIGJJIJIEGHGHIJJGGIIIIJIFGIJJIIJIIIJJIIJJJJJIHHGJJGIIIIGIIIHIIFHGHFADFFFDFDE(;@CE
@HS2000-1015_160:5:2101:1745:52266/2
CCCCAGAATTCTCTTGTTTTTTCCTTGGTGATCCAGGAAAACGAAGCCCCCTCCTGTATTGACAGCTGGGAATTGTGGAGTCCACCGTCCTCCACCTGAG
+
C@CFFFFFHHHHHJIJJIJJJJJIIICHCEGIIIEHGIIHIJIGGGIJCHGIHHHGEFHHHGHEEFFDEDAC?CDDCDCD>95>:,,99@DCC?<AB9AC

Имена файлов результатов, которые я получаю:

${SM}.5.fastq
${SM}.6.fastq
${SM}.7.fastq

Имена файлов результатов, которые я хочу:

sample1.5.fastq 
sample1.6.fastq
sample1.7.fastq

person MAPK    schedule 07.11.2020    source источник
comment
Пожалуйста, проверьте, поможет ли эта ссылка вам Как использовать переменные оболочки в awk   -  person RavinderSingh13    schedule 07.11.2020
comment
@ RavinderSingh13 Мой код разбивает файлы, но имена файлов не такие, как я хотел. Имена файлов должны быть похожи на мои Result file names I want: выше в вопросе.   -  person MAPK    schedule 07.11.2020
comment
сколько строк вы хотите вывести в выходной файл? Не могли бы вы уточнить эту часть.   -  person RavinderSingh13    schedule 07.11.2020
comment
@ RavinderSingh13 На выходе должно быть три файла .fastq. Я просто не могу добавить ${SM} к именам моих файлов. Содержимое файлов правильно указано кодом выше. Мне просто нужно добавить $SM к именам моих выходных файлов.   -  person MAPK    schedule 07.11.2020


Ответы (2)


EDIT: Согласно комментарию OP добавление решения (улучшенное), включая изменение имени выходного файла.

SM="sample1"
awk -v sm="$SM" '
BEGIN{FS = ":"} 
/^@HS/{
  split($1,arr,"_")
  sub(/^@[a-zA-Z]+/,"",arr[1])
  lane=$2
  close(outputFile)  
  outputFile=sm"."arr[1]"."lane".fastq"
}
{
  print >> (outputFile)
}' File.fastq


Исправить попытку OP: Не могли бы вы попробовать следовать, вы могли бы на самом деле использовать -v awk_var_name="$shell_var", для которого я также поделился ссылкой в ​​разделе комментариев, я также исправил несколько вещей в вашем коде.

SM="sample1"
awk -v sm="$SM" '
BEGIN{FS = ":"} 
{
  close(outputFile)
  lane=$2
  outputFile=sm count "."lane".fastq"
  print > (outputFile)
  for (i = 1; i <= 3; i++){getline ; print  > (outputFile)}
}' File.fastq

Исправлены попытки OP:

  • Создана переменная outputFile с именем выходного файла для ясности.
  • Использовали команду close, чтобы закрыть выходной файл, чтобы мы не получили too many file opened error
  • По мнению экспертов, getline не очень рекомендуется, поэтому изменили этот подход к проверке проверки номера строки, выполнив FNR%4==0

В идеале это может быть так:

SM="sample1"
awk -v sm="$SM" '
BEGIN{FS = ":"} 
/^@HS/{
  lane=$2
  close(outputFile)  
  outputFile=sm count "."lane".fastq"
}
{
  print >> (outputFile)
}' File.fastq
person RavinderSingh13    schedule 07.11.2020
comment
Это сработало. Спасибо. Также возможно добавить lane=$1 к имени файла. то есть sample1.HS2000-1015_160.5.fastq, sample1.HS2000-1015_160.5.fastq и sample1.HS2000-1015_160.5.fastq? - person MAPK; 07.11.2020
comment
@MAPK, хорошо, я оставлю эти 2 решения, поскольку это был базовый вопрос, а также добавит отредактированное решение через несколько минут или около того. - person RavinderSingh13; 07.11.2020
comment
@MAPK, но ваш $1 НЕ всегда имеет 2000-1015, тогда, пожалуйста, объясните логику добавления его в имя выходного файла? Это похоже на необходимость добавления константы или по какой-либо логике? - person RavinderSingh13; 07.11.2020
comment
Это @HS2000-1015_160, мне просто нужно добавить HS2000-1015_160. Хотя и не константа. - person MAPK; 07.11.2020
comment
@MAPK, не могли бы вы проверить мое решение EDIT, если оно вам поможет (хотя я его не проверял)? - person RavinderSingh13; 07.11.2020
comment
@MAPK, не могли бы вы проверить это сейчас и сообщить мне, поможет ли это вам? - person RavinderSingh13; 07.11.2020
comment
Это работает, но также печатает имена файлов на терминале. Есть ли способ подавить это › - person MAPK; 07.11.2020
comment
@MAPK, извините, я оставил это для проверки имени выходного файла :), пожалуйста, проверьте его сейчас, мы все должны быть в порядке :) - person RavinderSingh13; 07.11.2020

Ваша проблема в том, что ${SM} не раскрывается как переменная внутри кавычек '.

Это работа — это дизайн.

Простое и грязное решение — заменить ${SM} на '${SM}' во всех местах, подобных этому:

SM="sample1"
awk 'BEGIN {FS = ":"} {lane=$2 ; print > "'${SM}'."lane".fastq" ; for (i = 1; i <= 3; i++) {getline ; print > "'${SM}'."lane".fastq"}}' < File.fastq

Таким образом, переменная ${SM} расширяется в однострочный сценарий.

Другой вариант. Запишите свой awk-скрипт в файл и передайте разделитель полей -F option и входную переменную -v option . Как показано ниже:

скрипт.awk

{
  lane=$2 ; 
  print > SM"."lane".fastq" ; 
  for (i = 1; i <= 3; i++) {
    getline ; 
    print > SM"."lane".fastq";
  }
} 

беги script.awk

SM="sample1"
awk -F";" -v SM=${SM} -f script.awk File.fastq

улучшенный script.awk

{
  outFile = SM"."$2".fastq";
  print > outFile ; 
  for (i = 1; i <= 3; i++) {
    getline; 
    print > outFile;
  }
} 
person Dudi Boy    schedule 07.11.2020