Причина вашей неудачной команды проста.Переменная list
содержит многострочную строку, сохраненную из файлов pos.txt
, включая символы новой строки.Вы не можете передать не более одного целочисленного значения для флага -c
.
Ваши попытки довольно легко исправить, удалив вызовы на cat
и используя временную переменную для хранения содержимого файла
while IFS= read -r lineNo; do
tail -c "$lineNo" ref.txt | head -c1
done < pos.txt
Но тогда, если вы намерены каждый раз выводить желаемый вывод в новой строке, head
не выводит таким образом.Он просто формирует строку atga
для заданного вами ввода в одну строку, а не в нескольких строках с одним символом в каждой строке.
Как упоминает Гордон в одном из комментариев, длягораздо более эффективная обработка файлов FASTA, вы можете просто использовать один вызов awk
(пропуская несколько вилок до head
/ tail
).Ваш предоставленный ввод не включает какие-либо заголовки для пропуска, которые были бы просты как
awk ' FNR==NR{ n = split($0,arr,""); for(i=1;i<=n;i++) hash[i] = arr[i] }
( $0 in hash ){ print hash[$0] } ' ref.txt pos.txt