Я плохо знаком с Ubuntu и кодирующий в целом, но должен использовать ее, чтобы сделать некоторый анализ молекулярных данных упорядочивания, и я застреваю!
Я недавно переместился со своего ноутбука на более мощный ПК (оба с VM, смонтированным в нем), и часть моего сценария теперь больше не работает.
Код, который я использую для разделения одного файла (Map.txt) на отдельные файлы затем, переименовывает каждый файл и наконец добавляет, что строка заголовка от исходного файла до каждого отдельного файла:
$ tail -n +2 Map.txt | split -l 1
$ awk '{cmd="echo " $0 ">" $1; system(cmd)}' x*
$ for file in `ls N*`; do echo "`head -1 Map.txt`" > tmp; cat $file >> tmp; mv –f tmp $file; done
Каждая команда выполняется индивидуально, но я теперь получаю ошибку при высказывании:
mv: target 'NC2B7' is not a directory
когда я выполняю третью команду выше ($ для файла в и т.д.). Я не уверен, почему эта команда внезапно не работает, я использовал старый Oracle VM VirtualBox на своем ноутбуке и теперь использую Oracle VM VirtualBox v5.2.18 с человечностью 16.04 для выполнения QIIME.
Кто-то может сказать мне, какова могла быть причина этого и / или какова третья команда должна теперь быть?
Изменение
$ for file in `ls N*`; do echo "`head -1 Map.txt`" > tmp; cat $file >> tmp; mv –f tmp $file; done
кому:
$ for file in `ls N*`; do echo "`head -1 Map.txt`" > tmp; cat $file >> tmp; mv -f tmp $file; done
Различие не легко видеть, но в Вашей команде Вы использовали длинного тире вместо нормального тире в mv
- команда, -f
- опция. Я протестировал его, и это работало.
Для предотвращения несчастных случаев с именами файлов, содержащими пробелы, необходимо добавить некоторые двойные кавычки:
$ for file in `ls N*`; do echo "`head -1 Map.txt`" > tmp; cat "$file" >> tmp; mv -f tmp "$file"; done
Вы могли также упростить целую команду до
$ for file in N*; do head -1 Map.txt > tmp; cat "$file" >> tmp; mv -f tmp "$file";
который был предложен @PerlDuck. Конечно, я протестировал это предложение прежде, чем добавить его к этому ответу.