Как получить определенные строки из нескольких текстов одновременно?

deuseradd(8):

-M, --no-create-home

Do no create the user's home directory, even if the system wide setting
from /etc/login.defs (CREATE_HOME) is set to yes.
-2
20.04.2019, 17:19
3 ответа

Одним из способов было бы

find. -name "text*.txt" -type f -print0 | xargs -0 -I{} sh -c 'f="{}"; head -100 "$f" > "${f%.txt}_new.txt"'
  • find. -name "text*.txt" -type fнаходит все текстовые файлы в каталоге
  • -print0печатает путь к файлу с нулевым символом для сохранения пробелов
  • xargs -0принимает аргументы, оканчивающиеся нулем
  • -I{}используется в качестве заполнителя для аргумента
  • sh -cвыполняет тире с командной строкой
  • f="{}"сохраняет аргумент в переменнойf
  • head -100 "$f"главная команда
  • "${f%.txt}_new.txt"заменяет ".txt" на "_new.txt" в аргументе
0
28.04.2021, 23:34

Вы можете перебирать файлы

for f in *.txt
do
    head -n100 "$f" > "${f%.txt}_new.txt"
done

Предостережение заключается в том, что *.txtбудет расширяться в момент достижения, чтобы перечислить все файлы, которые соответствуют. Если вы уже запускали этот сценарий (частично или полностью ), он также будет соответствовать некоторым файлам результатов. Решение состоит в том, чтобы либо удалить их перед запуском (rm *_new.txt), либо сжать шаблон.

0
28.04.2021, 23:34

Если вы хотите "параллельно", используйтеparallel

shopt -s extglob
parallel sh -c 'out="${1%.txt}_new.txt"; head -n 100 "$1" > "$out"' _ -- !(*_new).txt

Я предполагаю, что у вас оболочка bash, и вы используете расширенные шаблоны для перебора текстовых файлов, которые не не *_new.txt

0
28.04.2021, 23:34

Теги

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