Печатать несколько имен файлов в определенные строки txt-файла

Я пытаюсь напечатать список имен файлов в текстовый файл с требованием печатать определенные имена файлов в одной строке. Например, у меня есть 4 файла.

Paleo_R1.fastq
Paleo_R2.fastq
Vegan_R1.fastq
Vegan_R2.fastq

Я хочу, чтобы вывод был

Paleo_R1.fastq Paleo_R2.fastq
Vegan_R1.fastq Vegan_R2.fastq

Я знаю, что могу использовать функцию ls и направить вывод в текстовый файл, используя ls >> file.txt, но нет опций для печати определенного ввода строки в определенные строки вывода.

Кроме того, я знаю, что могу использовать такие циклы for >

for file in Vegan*R1*.fastq; 
do echo $file ${file%_R1.fastq}_R2.fastq >> file.txt;
done

Но я не хочу иметь отдельную команду для каждого имени файла, т.е. для веганов и палео.

Есть ли способ напечатать определенные строки в определенные строки вывода (вывести строки ввода 1 и 2 в строку вывода 1, а строки ввода 3 и 4 в строку вывода 2 и т. д.)

РЕДАКТИРОВАТЬ: Правило основано на каждых N=2 файлах, а не на именах файлов.

0
25.04.2019, 21:58
2 ответа

У @michael -Хэмптона самый правильный ответ, но для справки, я был нетерпелив и также создал службу systemd под названием vfio-pci-bind.service, которая выполняетvfio-pci-bind.sh:

[Unit]
Description=bind PCI card to vfio

[Service]
ExecStart=/opt/vfio-pci-bind/vfio-pci-bind.sh "0000:03:00.1"
Type=oneshot
RemainAfterExit=yes

затем я добавил кlibvirt-guests.service:

[Service]
...
Wants=vfio-pci-bind.service
After=vfio-pci-bind.service

Проблемы с этим

  • он полагается на systemd, а не на сам -содержится в libvirt
  • он выполняет привязку vfio -pci -независимо от того, действительно ли затронутая виртуальная машина будет запущена при загрузке

Так что да, я переключусь на хуки libvirt, спасибо за помощь!

-121 ---211857 ​​-

Возможно

$ ls *.fastq | xargs -n2
Bar_R1.fastq Bar_R2.fastq
Bar_R3.fastq Foo_R1.fastq
Foo_R2.fastq Foo_R3.fastq
Paleo_R1.fastq Paleo_R2.fastq
Vegan_R1.fastq Vegan_R2.fastq

или для столбцового вывода

$ ls *.fastq | xargs -n2 | column -t
Bar_R1.fastq    Bar_R2.fastq
Bar_R3.fastq    Foo_R1.fastq
Foo_R2.fastq    Foo_R3.fastq
Paleo_R1.fastq  Paleo_R2.fastq
Vegan_R1.fastq  Vegan_R2.fastq

(добавьте >> file.txtк команде, чтобы добавить вывод в файл)

Обратите внимание, что оба примера работают только с именами файлов без пробелов.

Для файлов с пробелами:

$ for i in *.fastq; do echo -ne "$i\0"; done | xargs -0 -n2
2
28.01.2020, 02:30

Одним из вариантов было бы установить нужные имена файлов в качестве текущих аргументов оболочки, а затем попросить printfнапечатать их парами:

set -- *
printf '%s %s\n' "$@"  > output

или только определенные файлы:

set -- *_R?.fastq

Порядок зависит от раскрытия подстановочного знака, который вы использовали. Если вы хотите больше контролировать последовательность, вы можете как-то вручную разделить глоб, например:

set -- Paleo*.fastq Vegan*.fastq Omnivore*.fastq FastFood*.fastq
0
28.01.2020, 02:30

Теги

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