Невозможно использовать --prepipe с miller в Windows 10
Miller - прекрасный инструмент для работы с большими наборами данных. Однако, будучи новичком в этом, я столкнулся с некоторыми проблемами при работе с ним на консоли Windows.
Я работаю в основном с большими .csv
файлы, которые я сжимаю с помощью "Параллельной реализации gzip", двоичные файлы для которых доступны по адресу https://binaries.przemoc.net/
Однако я не могу использовать --prepipe
с Миллером в консоли Windows.
Если я использую:
pigz -dcq example.csv.gz
или
pigz -dcq < example.csv.gz
результат в точности такой, как ожидалось, то есть:
id,name
100,alice
200,bob
300,carol
400,david
500,edgar
Использование команды miller для красивой печати с использованием символа вертикальной черты:
pigz -dcq example.csv.gz | mlr --icsv --opprint cat
также дает ожидаемый результат:
id name
100 alice
200 bob
300 carol
400 david
500 edgar
Но когда я пытаюсь использовать --prepipe
mlr --prepipe 'pigz -dcq' --icsv --opprint cat example.csv.gz
Я получаю следующую ошибку:
mlr: Couldn't popen "pigz -dcq < 'example.csv.gz'" for read.
pigz -dcq < 'example.csv.gz': No such file or directory
Что вызвало эту ошибку?
Я обнаружил, что можно использовать либо отсутствие кавычек, либо двойные кавычки:
pigz -dcq < example.csv.gz
pigz -dcq < "example.csv.gz"
Но использование одинарных кавычек вызывает ошибку:
pigz -dcq < 'example.csv.gz'
С помощью --prepipe
приводит к одинарным кавычкам, которые не работают, как показано выше. При использовании одного сжатого файла я, конечно, могу использовать вертикальную черту, но мне нужно использовать несколько сжатых файлов, для которых--prepipe
важно, как указано в документации. Как использовать--prepipe
в консоли Windows? Любая помощь будет оценена.
Дополнительная информация: я нашел другой случай, когда использование одинарных кавычек вызывает проблемы; использование двойных кавычек - единственный способ получить результат. Пожалуйста, проверьте тестовый файл:
mlr --icsv --opprint cat test.csv
alpha num
a 1
b 2
c 3
d 4
e 5
a 6
b 7
h 8
a 9
j 10
Если я использую filter
с символом больше, чем в двойных кавычках, все работает нормально:
mlr --icsv --opprint filter "$num > 5" test.csv
alpha num
a 6
b 7
h 8
a 9
j 10
Но если я использую filter
с символом больше чем в одинарных кавычках (как показано в документации), это вызывает ошибку:
mlr --icsv --opprint filter '$num > 5' test.csv
mlr DSL: syntax error at "test"
mlr filter: syntax error on DSL parse of '$num test.csv'
Причина сбоя в том, что символ "больше" интерпретируется как перенаправление на команду файла. Новый файл с нулевым байтом с именем 5' создается в той же папке, что и test.csv. При использовании одинарных кавычек символ "больше" необходимо экранировать с помощью ^ (символ вставки).
Так что я думаю, может быть, если --prepipe
используются двойные кавычки внутри, он должен нормально работать в Windows. Или, может быть, есть какой-то способ побега, который мне еще предстоит открыть.