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

#!/bin/bash
while IFS= read -r samp1; do

b=${samp1%_R1.fastq.gz} samp2=${b}_R2.fastq.gz

cat - <<eof > "${b##*/}.cfg"
**fastq1        = $samp1**
**fastq2        = $samp2**

mailto         = r...@gmail.com
thread_no      = 8

detect_integration = yes  # if no is provided, VirusFinder will not detect virus integrations
detect_mutation    = no   # if no is provided, VirusFinder will not detect viral
eof
done < LIST1

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

0
18.08.2019, 14:57
2 ответа

С помощью Perlвы работаете в режиме абзаца, то есть позволяете perl проглатывать абзац за раз, используя опцию -00.

Затем из текущей записи возьмите первое поле (, разделенное двоеточием ), и сохраните его в виде хеша.

$ perl -l -00ane '
    my %h = reverse /^(([^:]+):.*)$/mg;
    print $h{$_} for qw/name age city state/;
' input.file

С вашими конкретными требованиями вы можете сделать это:

cat - <<\eof > code.sh
if=$1;shift
perl -ls -00ane '
  my %h = reverse /^(([^:]+):.*)$/mg;
  print $h{$_} for split /\s+/, $order;
' -- -order="$*" "$if"
eof

Затем, после создания файла кода, запустите его:

sh code.sh inputfile name age city state
1
28.01.2020, 02:39
Done in 2 steps Tested and worked fine in both scenarios

а. cp orginalfile fileneedto_be_changed' (Нужно сделать только один Раз)

orginalfile=====>which supposed to be changed

б.

differencecount=`awk 'NR==FNR{a[$0];next}!($0 in a){print $0}' orginalfile fileneedto_be_changed|wc -l`

if [ $differencecount -eq  0 ]
then
echo "NO changes in file"
else
echo "Noted there is changes in file"
fi
-121 ---47558 ​​-

Поскольку вы не знакомы с Perl, я буду немного многословен.

Во-первых, Perl — это утилита Linux, которая берет ваш входной файл и преобразует его с помощью команд для получения желаемого результата.

Обычно Perl проверяет входной файл построчно. Строка отделяется от следующей с помощью символа ascii \012, также известного как \n, называемого новой строкой. Но в этом случае мы бы предпочли читать абзац за раз. И как Perl идентифицирует пара?

Опция

-00будет обрабатывать пп. Они сохраняются в скаляре текущей записи$_

Обратите внимание, что запись теперь должна состоять из нескольких строк.

Я представляю это как :^....$ ^...$ ^....$В основном смежные острова линий. Все острова разделены символом \n.

Используемые параметры Perl:

-lэто делает две вещи,удалить разделитель входной записи из текущей записи, $ _, и при печати поставить его обратно :$/ = $\ = "\n"

-sэто включает рудиментарный синтаксический анализ переключателей командной строки. С его помощью мы можем указать порядок вывода переменных из самой командной строки.

-00— разделитель IRS, установленный в режим абзаца = пустая строка. Это будет поглощать абзацы из входных данных по одному и сохранять в $_для каждой итерации.

-nэто создает цикл вокруг файла, что означает, что он будет считывать из входного файла (на самом деле дескриптор файла, но это несущественно для нашего уровня )но не будет печатать его в конце, когда все преобразования завершены были применены к текущей записи. Вы должны сделать это явно.

-eЭто параметр, сообщающий Perl, что следующий за ним правильный код Perl будет применен к текущей записи.

--=>конец параметров командной строки Perl и то, что следует сейчас, это переключатели (, которые начинаются с тире ), а затем файлы до конца. Если у вас могут быть имена файлов, начинающиеся с тире, лучше начинать их с./ или указывать полный или относительный путь, или поместить еще один --, чтобы сигнализировать об окончании переключателей.

#

Теперь идет algorithmчасть:

my %h = reverse /^(([^:]+):. *)$/mg;

В Perl хэши или ассоциативные массивы обозначаются процентом %перед их именем. Таким образом, в нашем случае мы строим хеш %hи помещаем myперед ним, что означает, что он будет лексическим и выйдет из области видимости всякий раз, когда считывается следующая запись. Это означает, что новый новый хэш создается для каждого записывать.

Что означает выражение /..../mg? Во-первых, все регулярные выражения всегда привязаны к какой-либо скалярной переменной или выражению с помощью оператора if =~. Но здесь мы не видим ни одного. Неявно он привязан к переменной $_, что в данном случае означает текущую запись.

Продолжение следует---

0
28.01.2020, 02:39

Теги

Похожие вопросы