import java.io.*;
import java.util.*;

/**
 * @author Nikita Doschennikov (me@fymio.us)
 */
public class WordStatLengthMiddle {

    public static void main(String[] args) {
        if (args.length != 2) {
            System.err.println("incorrect input!");
            System.err.println(
                "usage: java WordStatLengthMiddle <inputFile> <outputFile>"
            );
        }

        String inputFileName = args[0];
        String outputFileName = args[1];
        try {
            BufferedReader r = new BufferedReader(
                new FileReader(inputFileName)
            );

            Map<String, WordInfo> wordMap = new HashMap<>();
            StringBuilder sb = new StringBuilder();
            int wordIndex = 0;

            int data = r.read();
            while (data != -1) {
                char c = (char) data;

                if (
                    Character.getType(c) == Character.DASH_PUNCTUATION ||
                    Character.isLetter(c) ||
                    c == '\''
                ) {
                    sb.append(c);
                } else {
                    if (sb.length() > 0) {
                        String word = sb.toString().toLowerCase();
                        if (word.length() >= 7) {
                            word = word.substring(3, word.length() - 3);
                            if (wordMap.containsKey(word)) {
                                wordMap.get(word).count++;
                            } else {
                                wordMap.put(
                                    word,
                                    new WordInfo(word, 1, wordIndex)
                                );
                                wordIndex++;
                            }
                        }
                        sb.setLength(0);
                    }
                }

                data = r.read();
            }

            if (sb.length() > 0) {
                String word = sb.toString().toLowerCase();
                if (word.length() >= 7) {
                    word = word.substring(3, word.length() - 3);
                    if (wordMap.containsKey(word)) {
                        wordMap.get(word).count++;
                    } else {
                        wordMap.put(word, new WordInfo(word, 1, wordIndex));
                        wordIndex++;
                    }
                }
            }

            r.close();

            List<WordInfo> sortedWords = new ArrayList<>(wordMap.values());
            sortedWords.sort(
                Comparator.comparingInt((WordInfo w) ->
                    w.word.length()
                ).thenComparingInt(w -> w.firstIndex)
            );

            PrintWriter writer = new PrintWriter(outputFileName, "UTF-8");

            for (WordInfo info : sortedWords) {
                writer.println(info.word + " " + info.count);
            }

            writer.close();
        } catch (Exception ex) {
            System.err.println("An error occured: " + ex.getMessage());
        }
    }
}
