Я хочу, чтобы SAMPLES
был списком элементов в файле SRR_Acc_list.txt
, разделенном новой строкой.
Я пытался:
SAMPLES = cat "./input/SRR_Acc_list.txt" | tr -d '\n'
Вход:
SRR9200813
SRR9200814
SRR9200815
SRR9200816
SRR9200817
Ожидаемый результат:
SAMPLES = ["SRR9200813", "SRR9200814", "SRR9200815", "SRR9200816", "SRR9200817"]
Если вы отредактируете свой вопрос, чтобы предоставить минимальный воспроизводимый пример , который включает в себя минимальный сценарий, показывающий, как вы бы установили SAMPLES
вручную и что вы затем хотите с ним делать, тогда мы можем помочь вам, но сейчас это выглядит много как XY Вопрос
Вы можете изменить свою команду, чтобы использовать команду xargs для преобразования файла с разделителями новой строки в список элементов, разделенных пробелами, а затем заключить вывод в квадратные скобки, чтобы создать список.
Вот пример команды, которая должна работать:
SAMPLES=$(cat "./input/SRR_Acc_list.txt" | xargs echo | tr ' ' '\n' | sed -e 's/\(.*\)/"\1"/' | tr '\n' ',')
SAMPLES = "[$(echo ${SAMPLES::-1})]"
Вы получите вывод:
$ echo $SAMPLES
["SRR9200813","SRR9200814","SRR9200815","SRR9200816","SRR9200817"]
Эта команда делает следующее:
cat
xargs
для преобразования файла с разделителями новой строки в список элементов, разделенных пробелами.tr
для замены пробелов символами новой строкиsed
для заключения каждого элемента в двойные кавычки.tr
для замены новой строки запятымиОбратите внимание, что последняя переменная SAMPLES
включает запятую в конце, что может вызвать синтаксические ошибки в некотором коде Python. Вы можете удалить запятую вручную или изменить команду, чтобы удалить ее автоматически.
Или альтернатива awk
:
SAMPLES=$( awk 'BEGIN{printf "["} {if (NR==1){printf "\x22%s\x22",$1}else{printf ",\x22%s\x22",$1}}END{printf "]"}' SRR_Acc_list.txt )
echo $SAMPLES
["SRR9200813","SRR9200814","SRR9200815","SRR9200816","SRR9200817"]
Без двойных кавычек в команде echo
bash
интерпретирует содержимое переменной, и результат будет сильно отличаться от того, что вы показали.
Не в моей оболочке @Cyrus - вышеприведенное копируется и вставляется. На самом деле вывод выглядит идентично, когда я заключаю переменную в двойные кавычки.
Интересный. Какую оболочку и какую версию используете?
bash --version GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Я использую ту же версию. Это должен быть какой-то параметр конфигурации в моей системе. В других системах у меня нет этой проблемы, и я получаю результат, который вы показали. От SAMPLES=[SRR9200813]; echo $SAMPLES
я получаю такой вывод: 1 2 3
Странно.
Как странно... дело в локали?
Не могли бы вы попробовать следующее:
mapfile -t ary < <(sed 's/.*/"&"/' "./input/SRR_Acc_list.txt")
printf "[%s]\n" $(IFS=,; echo "${ary[*]}")
Выход:
["SRR9200813","SRR9200814","SRR9200815","SRR9200816","SRR9200817"]
mapfile
присваивает массив ary
содержимому разделителя новой строки
файл.IFS
запятой создает список, разделенный запятыми, с "${ary[*]}"
. Модификация IFS
ограничена подоболочкой $(...)
и не влияет на другие следующие команды.Очень красиво и чисто :)
Аналогичная альтернатива: mapfile -t a < SRR_Acc_list.txt ; printf "%s " "${a[@]}" | sed -e 's/^/["/;s/ $/"]/;s/ /", "/g'
Если ed
доступен/приемлем, что-то вроде:
#!/bin/sh
ed -s SRR_Acc_list.txt <<'EOF'
g/./s/^/"/\
s/$/", /
,j
s/^/SAMPLES = [/
s/, $/]/
,p
Q
EOF
Или вы можете создать ed
сценарий script.ed
, назвать его по своему усмотрению,
script.ed
g/./s/^/"/\
s/$/", /
,j
s/^/SAMPLES = [/
s/, $/]/
,p
Q
Теперь запустите:
ed -s SRR_Acc_list.txt < script.ed
В одну_строку
printf '%b\n' 'g/./s/^/"/\\\ns/$/", /' ',j' 's/^/SAMPLES = [/' 's/, $/]/' ',p' 'Q' | ed -s SRR_Acc_list.txt
Выход
SAMPLES = ["SRR9200813", "SRR9200814", "SRR9200815", "SRR9200816", "SRR9200817"]
Я думаю, вы идете по неверному пути. Вы используете имя переменной в верхнем регистре, ставите пробелы вокруг
=
, не используете правильный синтаксис для сохранения вывода команды, имеете бесполезное использование Cat, удаляете все свои новые строки, которые превратят вывод вашей команды во что-то это больше не действительный текстовый файл и показывает ожидаемый результат, который не является допустимым синтаксисом оболочки и поэтому неоднозначен в отношении того, что вы хотите. Учитывая это, любой ответ, который вы получите, вряд ли будет тем, что вы действительно должны делать для любой проблемы, которую пытаетесь решить.