Передать вывод из предыдущей команды в следующую команду

Опоздали на 3 года; но для протокола:

В установщике bsd 11 была ошибка, которая всегда делала /boot отдельным пулом zpool с именем «bootpool». Это было необходимо для зашифрованных корневых дисков (ядро ​​и модули должны были оставаться незашифрованными ); но из-за ошибки установщик делал это независимо от шифрования (, см.:https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=212258)

Это также обсуждается на форумах FreeBSD:https://forums.freebsd.org/threads/42980/и https://forums.freebsd.org/threads/59004/

.

1
25.07.2019, 23:53
1 ответ
for name in *.txt; do
    cut -f 5,10 -- "$name" | sort -k 1,1 >"$name.sort"
done

Это позволит объединить эффект двух начальных циклов, избавившись от использования промежуточных файлов.

Я внес небольшие изменения:

  • Заключение расширения всех переменных, потому что Когда необходимо двойное -заключение в кавычки?
  • Использование лучшего имени для переменной цикла.
  • Разделение переменной из команды cutс использованием --для обозначения конца параметров, если имя файла в $nameначинается с дефиса.

Можно также использовать sort -k 1,1 -o "$name.sort"вместо команды sortвыше, чтобы позволить утилите sortсоздать выходной файл, а не оболочку (небольшое отличие ).


Утилита xargsчасто используется вместо цикла:

printf '%s\n' *.txt | xargs -I {} sh -c 'cut -f 5,10 -- "$1" | sort -k 1,1 >"$1.sort"' sh "{}"

... но здесь это только усложняет задачу (приведенная выше команда будет иметь проблемы с обработкой имен файлов, содержащих символы новой строки ).

Ваша команда

cut -f 5,10 $i >$i.txt.out | xargs -I{} sort -k1,1  {} >$i.sort

выполнит cutи сохранит вывод в$i.txt.out$iрасширенным ). Команда xargsне получит ввода из-за перенаправления вывода cutв файл. Если бы вы не перенаправили вывод cut, xargsвыполнил бы sortс содержимым файлов в качестве аргументов, а не с именами файлов.Это не то, что вы хотите (, вы хотите передать вывод cutкак данные вsort).

2
27.01.2020, 23:41

Теги

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