Как сохранить пути к файлам из текстового файла с разделителями табуляции в массиве bash - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть текстовый файл с разделителями табуляции с одним столбцом путей к файлам, например, table.txt

> SampleID  Factor  Condition   Replicate   Treatment   Type    Dataset isPE    ReadLength  isREF   PathFASTQ
> DG13  fd3 c1  1   cc  0   0102    0   50  1   "/path/to/fastq"
> DG14  fd3 c1 1    cc  1   0102    0   50  1   "/path/to/fastq"

Я хотел бы сохранить пути в массиве bash, чтобы их можно было использовать в последующие параллельные вычисления (массивы задач SGE). Для простоты, ведущий и конечный " могут быть легко не включены в table.txt.

За исключением строки заголовка, я попробовал следующее:

files=($(awk '{ if(($8 == 0)) { print $1} }' table.txt ))    
paths=($(awk '{ if(($8 == 0)) { print $11} }' table.txt ))
infile="${paths[$SGE_TASK_ID]}"/"${files[$SGE_TASK_ID]}".fastq.gz

$SGE_TASK_ID занимает пользовательское целочисленное значение между (1-N), если кто-то не знает.

К сожалению $infile не показывает ожидаемое значение для $SGE_TASK_ID=1:

/path/to/fastq/DG13.fastq.gz

Спасибо за ваша помощь.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Не могли бы вы попробовать следующее:

while read -r -a ary; do
    ((nr++)) || continue                # skip header line
    if (( ${ary[7]} == 0 )); then       # if "isPE" == 0 ..
        path=${ary[10]#\"}              # remove leading double-quote
        path=${path%\"}                 # remove trailing double-quote
        file=${ary[0]}
        infile[$((++SGE_TASK_ID))]="${path}/${file}.fastq.gz"
    fi
done < table.txt

echo "${infile[1]}"
echo "${infile[2]}"

Вывод:

/path/to/fastq/DG13.fastq.gz
/path/to/fastq/DG14.fastq.gz
2 голосов
/ 19 февраля 2020

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

myarr=($(awk '{gsub(/\r/,"")} match($NF,/\/[^"]*/){\
         val=substr($NF,RSTART,RLENGTH);\
         num=split(val,array,"/");\
         print val"/"$1"."array[num]".gz"}'  Input_file))
for i in "${myarr[@]}"
do
  echo $i
done

Если вы хотите удалить управляющие символы M из самого файла Input_file, попробуйте также выполнить следующее:

tr -d '\r' < Input_file > temp && mv temp Input_file

Когда мы печатаем массив с l oop, как показано выше, вывод будет следующим:

/path/to/fastq/DG13.fastq.gz
/path/to/fastq/DG14.fastq.gz

Объяснение кода awk:

awk '                                 ##Starting awk program from here.
match($NF,/\/[^"]*/){                 ##Using match function of awk program here, match everything till " in last field.
  val=substr($NF,RSTART,RLENGTH)      ##Creating variable val which is sub-string where starting point is RSTART till value of RLENGTH.
  num=split(val,array,"/")            ##Creating variable num whose value is number of elements plitted by split, splitting val into array with / is delimiter.
  print val"/"$1"."array[num]".gz"    ##Printing val / first field DOT array last element then .gz here.
}
'  Input_file                         ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...