Как заменить пробелы во всех именах файлов подчеркиванием в Linux с помощью сценария оболочки?

  1. if ($ 1 $ 2 в массиве) не работает; вы должны выполнить if (($ 1, $ 2) в массиве) .
  2. Нельзя использовать массив [$ 3] и массив [$ 4] таким образом. Ваш массив выглядит как
     array [chrY, 59363551] = «chrY 59363551 G 8 0 7 0 0 0 1 0 5 0 0 0 0 0 0 0 7 0 0 0» 
    array [chrY, 59363552] = «chrY 59363552 G 7 0 7 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0» 
     ︙ 
    и когда вы говорите array [$ 3 ] и массив [$ 4] , вы имеете в виду массив [G] и массив [2] и т. Д. , которых не существует.
  3. Возможность указать > " filename " в awk коде - отличная возможность, когда вы хотите записать в несколько файлов. Это не так полезно, когда у вас есть только один выходной файл - почему бы вам просто не перенаправить вывод команды awk ?
  4. Длинные строки - это плохо. Разбивайте длинные команды на короткие строки. Уменьшите дублирование за счет повторного использования переменных.
  5. Не используйте массив с именем array . Это как переменная с именем переменная , файл с именем файл , человек по имени Человек и т. Д. {{ 1}} Используйте описательные имена.

Хорошо, но при этом

awk 'FNR==NR {file1data[$1,$2]=$0; next}
        {       if (($1,$2) in file1data) {
                        # Save desired values from file2.
                        file2arg03=$3
                        file2arg04=$4
                        file2arg08=$8
                        file2arg10=$10
                        file2arg12=$12
                        pct_file2=($8+$10+$12)/$4
                        # Get data from file1.
                        $0=file1data[$1,$2]
                        pct_file1=($8+$10+$12)/$4
                        print $1, $2, $3, $4, $8, $10, $12, pct_file1, \
                                file2arg03, file2arg04, file2arg08, file2arg10, file2arg12, \
                                pct_file2, pct_file1-pct_file2
                } else printf "(%s,%s) in file2 but not file1.%s", $1, $2, ORS
        }' treated.bam.tsv untreated.bam.tsv > awkoutput.bam.tsv

Как и ваша версия, эта команда сохраняет данные file1 в массиве , а затем выполняет всю работу / вывод, пока читает file2. Получив строку из файла2, он сохраняет нужные поля из этой строки в именованные переменные (мы также можем использовать другой массив, состоящий из пяти элементов) , а затем он восстанавливает данные из соответствующей строки в file1. Если присвоить всю строку $ 0 , это вызовет $ 1 , $ 2 , $ 3 , $ 4 и т. Д., для восстановления их исходных значений.

У вас действительно проблемы с написанием строки заголовка в выводе? Попробуйте:

        {       if (FNR == 1) {
                        print "chrom pos ref reads_all mismatches deletions insertions pct_file1 …"
                } else if (($1,$2) in file1data ) {
                        file2arg03=$3
                              ︙

Хорошо, вот версия, которая по духу ближе к вашей попытке, и обрабатывает строку заголовка:

awk 'FNR==NR {file1line[$1,$2]=$0; next}
        {       if (FNR == 1) {
                        print "chrom pos ref reads_all mismatches deletions insertions pct_file1 ref reads_all mismatches deletions insertions pct_file2 pct_sub …"
                } else if (($1,$2) in file1line ) {
                        # Get data from file1.
                        split(file1line[$1,$2], file1arg)
                        pct_file1=(file1arg[8]+file1arg[10]+file1arg[12])/file1arg[4]
                        pct_file2=($8+$10+$12)/$4
                        print $1, $2, file1arg[3], file1arg[4], file1arg[8], \
                                file1arg[10], file1arg[12], pct_file1, \
                                $3, $4, $8, $10, $12, pct_file2, pct_file1-pct_file2
                } else printf "(%s,%s) in file2 but not file1.%s", $1, $2, ORS
        }' treated.bam.tsv untreated.bam.tsv > awkoutput.bam.tsv

Это извлекает строку из файла1 (из file1line ) и передает его в split , чтобы разбить его на составляющие 23 значения, которые сохраняются в массиве file1arg . Затем он сможет использовать file1arg [3] , file1arg [4] ,…, так, как вы использовали array [ $ 3] , массив [$ 4] ,…

17
11.09.2018, 23:56
2 ответа

Это метод, который я нашел, столкнувшись с той же проблемой:

for f in *; do mv "$f" `echo $f | tr ' ' '_'`; done

Я писал файл скрипта bash для автоматического обновления сертификатов ssl.

6
27.01.2020, 19:46

Используйтеrename:

rename 's/\s/_/g'./*.xml

Нет необходимостиfind:)

5
27.01.2020, 19:46

Теги

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