Преобразование файлов с новыми строками в список

Я хочу, чтобы 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"]

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

Ed Morton 05.04.2023 00:50

Если вы отредактируете свой вопрос, чтобы предоставить минимальный воспроизводимый пример , который включает в себя минимальный сценарий, показывающий, как вы бы установили SAMPLES вручную и что вы затем хотите с ним делать, тогда мы можем помочь вам, но сейчас это выглядит много как XY Вопрос

Ed Morton 05.04.2023 00:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
55
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете изменить свою команду, чтобы использовать команду 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"]

Эта команда делает следующее:

  1. Читает файл с разделителями новой строки, используя cat
  2. Использует xargs для преобразования файла с разделителями новой строки в список элементов, разделенных пробелами.
  3. Использует tr для замены пробелов символами новой строки
  4. Использует sed для заключения каждого элемента в двойные кавычки.
  5. Использует tr для замены новой строки запятыми
  6. Оборачивает вывод в квадратные скобки для создания списка Python.

Обратите внимание, что последняя переменная 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"]
  1. Распечатать квадратную скобку
  2. В первой строке выведите элемент, заключенный в кавычки.
  3. Для всех последующих строк выведите элемент, заключенный в кавычки, с предшествующей запятой.
  4. После обработки всех строк выведите закрывающую квадратную скобку

Без двойных кавычек в команде echobash интерпретирует содержимое переменной, и результат будет сильно отличаться от того, что вы показали.

Cyrus 05.04.2023 01:15

Не в моей оболочке @Cyrus - вышеприведенное копируется и вставляется. На самом деле вывод выглядит идентично, когда я заключаю переменную в двойные кавычки.

tink 05.04.2023 01:28

Интересный. Какую оболочку и какую версию используете?

Cyrus 05.04.2023 01:38
bash --version GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
tink 05.04.2023 01:44

Я использую ту же версию. Это должен быть какой-то параметр конфигурации в моей системе. В других системах у меня нет этой проблемы, и я получаю результат, который вы показали. От SAMPLES=[SRR9200813]; echo $SAMPLES я получаю такой вывод: 1 2 3 Странно.

Cyrus 05.04.2023 02:30

Как странно... дело в локали?

tink 05.04.2023 03:05
Ответ принят как подходящий

Не могли бы вы попробовать следующее:

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 ограничена подоболочкой $(...) и не влияет на другие следующие команды.

Очень красиво и чисто :)

tink 05.04.2023 00:43

Аналогичная альтернатива: mapfile -t a < SRR_Acc_list.txt ; printf "%s " "${a[@]}" | sed -e 's/^/["/;s/ $/"]/;s/ /", "/g'

j_b 05.04.2023 00:51

Если 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"]

  • Измените Q на w, если требуется редактирование на месте.

  • Удалите ,p, чтобы отключить вывод.

  • См. GNU ред.

  • См. POSIX ред.

Другие вопросы по теме