2014-12-21 1 views
1
cat joined.txt | xargs -t -a <(cut --fields=1 | sort -u | grep -E '\S') -I{} --max-args=1 --max-procs=4 echo "mkdir -p imdb/movies/{}; grep '^{}' joined.txt > imdb/movies/{}/movies.txt" | bash 

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

< joined.txt xargs -t -a <(cut --fields=1 | sort -u | grep -E '\S') -I{} --max-args=1 --max-procs=4 echo "mkdir -p imdb/movies/{}; grep '^{}' joined.txt > imdb/movies/{}/movies.txt" | bash 

ответ

2

В любом случае, это cut команда внутри подстановки процессов (а не xargs), которые должны читать от joined.txt, так, чтобы быть полностью безопасным, вы должны поставить либо трубу или перенаправление ввода внутри замещение процесса. На самом деле, нет необходимости; cut может просто принять joined.txt в качестве аргумента.

xargs -t -a <(cat joined.txt | cut ...) ... | bash 

или

xargs -t -a <(cut -f1 joined.txt | ...) ... | bash 

Однако, это было бы ясным, чтобы пропустить процесс замены в целом, и направить вывод из этого трубопровода, чтобы xargs:

cut -f joined.txt | sort -u | grep -E '\S' | xargs -t ... 
+0

Существует история к Я пришел к решению, представленному в проблеме. Я пытался сделать содержимое join.txt доступным для grep commmand. Это позволило бы мне поместить xargs в конец конвейера, который производит join.txt (который является файлом 400 Мбайт). Насколько я вижу, mkdir, предшествующий grep, останавливает это от возможного, видите ли вы способ, которым это можно было бы сделать? –

+0

Это не сработает. 'grep', по-видимому, хочет, чтобы полное содержимое того, что' join.txt' будет, но вы будете только кормить части его для каждого 'grep' по мере создания файла. – chepner