3

Я использую оболочку zsh . Я пытаюсь использовать sed чтобы заменить текст во многих файлах, используя параллельные, чтобы ускорить процесс. Когда я проверил это на одном файле и позволил выводу команды перейти на стандартный stdout я увидел ожидаемый результат. Когда я попытался перенаправить этот вывод в файл, я получил пустой файл. В чем дело? Вот тривиальный пример использования одного файла данных, который вы можете вырезать и вставить, чтобы проиллюстрировать ...

setopt interactivecomments
#  In this trivial example it is obviously non-sensical
#  to use parallel, but in reality I have many files...

#  Some very simple input data...
paste <(printf "%s\n" `seq 1 4`) <(printf "%s\n" `seq 1 4`) > ./input.txt
#  This looks like:
#1       1
#2       2
#3       3
#4       4


#  Pass data file to parallel and use sed to substitute.
#  e.g. want to replace line '3 3' with '3 33'
#  Output goes to stdout & seems correct...
z=`find ./input.txt`
echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/"'
#1       1
#2       2
#3       33    ===> correct replacement
#4       4

# But redirecting to a file leads to empty file...
echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/" > {//}/result.txt'

# Empty file
cat ./result.txt

Что дает? Я указываю что-то неправильно?

Я использую:

  • Ubuntu 12.04.4 LTS
  • GNU parallel 20130522
  • GNU sed version 4.2.1
  • zsh 4.3.17

1 ответ1

3

При использовании перенаправления внутри команды для parallel , вы должны использовать {} чтобы поместить ввод в нужное место, в качестве параметра для sed:

echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/" {} > {//}/result.txt'

Кроме того, если используется {//} (или любая другая замещающая строка), parallel не добавляет автоматически ввод в конце команды. (В этом случае это было бы неправильно в любом случае, как это было бы после перенаправления. )

По сути, код в вопросе работает

sed "s/(^3.*3\)/\13/" > ./result.txt

но это должно быть

sed "s/(^3.*3\)/\13/" ./input.txt > ./result.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .