Ele canaliza o conteúdo de test.txt para a entrada de java myfile.java grammar.pcfg e, em seguida, redireciona o fluxo de saída do comando java para test1.txt e seu fluxo de erro para test2.txt .
Você pode achar um pouco mais fácil entender se ele é entre parênteses, como este (note que isso é para clareza e não é uma sintaxe válida):
(cat test.txt | java myfile.java grammar.pcfg) > test1.txt 2> test2.txt
Isso deixa mais claro que o primeiro arquivo de texto é um arquivo de entrada, enquanto os dois últimos são arquivos de saída.
(No entanto, o java myfile.java pouco realmente não faz sentido para mim - java é chamado nos arquivos .class, não nos arquivos .java.)