В bash:
Я пытаюсь объединить все файлы в каталоге, а затем подсчитать общее количество строк, используя одну команду. Я понимаю, что могу использовать | передать две команды по конвейеру:
! cat /data/files *.txt >> mergedfile.txt | wc -l ~/data/files/mergedfile.txt
Однако, похоже, это не работает. Я использую bash и работаю в iPython (таким образом, впереди!).
Ваш вопрос немного искажен:
!
для представления командной строки? Это нетипично. .txt
файлах в каталоге /data/files
? Для этого нужно сказать /data/files/*.txt
. Если вы имеете в виду что-то другое под /data/files *.txt
, пожалуйста, объясните это. >> mergedfile.txt
будет добавлять файлы к mergedfile.txt
, если он уже существует. Это то, что вы хотите? Если вы хотите что-то подобное, вы должны сказать об этом в своем вопросе. Во всяком случае, как сказано Arrow в комментарии , простое и очевидное решение — заменить |
на ;
,вот так:
$ cat /data/files/*.txt >> mergedfile.txt; wc -l mergedfile.txt
Примечания:
>>
добавляет файлы в mergedfile.txt
, если он уже существует. Если вы хотите игнорировать (, отбросить )любое предыдущее содержимое mergedfile.txt
, используйте >
вместо >>
. Небольшое улучшение по сравнению с предыдущим:
$ cat /data/files/*.txt > mergedfile.txt && wc -l mergedfile.txt
с &&
вместо ;
. Это приводит к выполнению команды wc -l
. только если команда cat
выполнена успешно.
Каждая из приведенных выше командных строк характеризуется как «список команд», содержащий два «конвейера» (, хотя на самом деле конвейеры не задействованы ). Если вы хотите сделать это как единый «конвейер», сделайте это:
$ cat /data/files/*.txt | tee mergedfile.txt | wc -l
который подсчитывает строки при объединении файлов, избавляя от необходимости читать выходной файл. Если вы хотите добавить к существующему mergedfile.txt
, используйте tee -a
.
Так и должно быть:
! cat /data/files/*.txt >> mergedfile.txt && wc -l /data/files/mergedfile.txt
Ваши команды состоят из двух команд -первый — cat
, который выводит в текстовый файл путем перенаправления -второй — вычислить длину результирующего файла
Эти две команды должны выполняться последовательно при условии, что первая успешно выполнена. Итак, вы используете &&
для цепочки. После перенаправления stdout
из cat
на mergedfile.txt
команда cat
не создает stdout
для трубопровода на wc
. Поэтому использовать |
неправильно.
В качестве альтернативы вы можете:
! cat /data/files/*.txt | wc -l
, который является более кратким и позволяет избежать использования временного файла. Здесь вывод cat
отправляется в wc
для непосредственного подсчета.
Обратите внимание , первый подход с использованием временного файла имеет много недостатков:
mergedfile.txt
перед его выполнением. Если вы начали без этого файла в своем рабочем каталоге, это нормально. Но очень часто вы пробовали некоторые команды (, например не ту, которую вы использовали сначала ), а затем забывали очистить временный файл и запустить правильную команду. Это все равно приведет к неправильному ответу. Действительно, если все строки находятся в /data/files/*.txt
, вы можете просто использовать >
вместо >>
. Сначала он очистит файл. Кроме того :, если вам нужно mergedfile.txt
для последующего использования, вы можете использовать tee
, чтобы сделать копию вывода:
! cat /data/files/*.txt | tee mergedfile.txt | wc -l
где tee
помещает свой stdin
в mergedfile.txt
и дублирует его в stdout
.