Как выполнить команду сортировки Unix (/ usr / bin / sort) из Java? - PullRequest
1 голос
/ 09 августа 2011

Я надеюсь использовать команду сортировки unix для сортировки большого текстового файла в Java.Я пытался выполнить сортировку с помощью компоновщика процессов, но безуспешно.Однако, когда я печатаю точную команду, которую она собирается выполнить, копирует и вставляет ее в терминал, она работает нормально.

До сих пор я пытался выполнить с / bin / sh -c "", убедившись, чтокаталог, в котором находится входной файл, и где выходной файл будет полностью разрешен (chmod 777), но безуспешно.

Вот код (если это выглядит смешно, примечание использует некоторые функции, найденные в Гуава )

File inputFile = new File(inputFileName);

//build the command (optional number of sort columns)
List<String> command = new LinkedList<String>();
command.addAll(ImmutableList.<String>of("sort","-t"+delimiter));
for (int i : sortFieldPositions) {
    command.add("-k"+i+","+i);
}
command.addAll(ImmutableList.<String>of(inputFileName,">",outputFileName));

//for debugging: output the command that will be executed
System.out.println("Executing: "+Joiner.on(" ").join(command));

//construct and start the process
Process process = new ProcessBuilder(command).redirectErrorStream(true).directory(inputFile.getParentFile()).start();
//for debugging: save process output
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder outputStringBuilder = new StringBuilder();
for (String line; (line = bufferedReader.readLine()) != null; /*reading taking place in check */) {
    System.out.println("FROM PROCESS: "+line);
    outputStringBuilder.append(line);
}
bufferedReader.close();

if (process.exitValue() != 0) {
    //something went wrong
    throw new RuntimeException("Error code "+process.exitValue()+" executing command: "+Joiner.on(" ").join(command)+"\n"+outputStringBuilder.toString());
}

К сожалению, это не работает со следующим выводом:

Executing: sort -t, -k2,2 -k1,1 /tmp/java/TestDataSorterImporterInput.txt /tmp/java/TestDataSorterImporterOutput.txt
FROM PROCESS: sort: stat failed: >: No such file or directory

Редактировать: может быть полезно отметить, что если я удаляю сохранение вывода(> выходной файл) из команды, затем команда выполняется без жалоб, и отсортированная версия появляется в выходных данных из входного потока процессов)

Ответы [ 3 ]

1 голос
/ 09 августа 2011

Это оболочка, которая знает, как выполнить перенаправление вывода.Программа сортировки не может сделать это самостоятельно.Поэтому, если вы хотите перенаправления, вам нужно сделать /bin/sh -c ..., чтобы позволить ей войти в цикл.

(вы пишете, что пытались это сделать, но что-то в этом не так).

0 голосов
/ 12 января 2015

Процесс process = новый ProcessBuilder ("/ bin / bash", "-c", "sort -t '|' -k2"). Start ();

0 голосов
/ 09 августа 2011

Попробуйте:

String whatever = "filename";
Process p = Runtime.getRuntime().exec("sort -t -k2 2 -k1 1 " + whatever);

См. этот сайт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...