Сортировка по определенному значению в строке. - PullRequest
0 голосов
/ 11 мая 2018

У меня есть файл с таким содержимым:

    666500872101_002.log
    738500861101_003.log
    738500861101_002.log
    666500872101_001.log
    741500881101_001.log
    738500861101_001.log
    741500881101_002.log
    666500872101_003.log
    741500881101_003.log
    666500872101_004.log

Мне нужно отсортировать строки по значениям в полях с 5 по 8, т.е. 7415 0088 1101_003.log atсначала, а затем на основе номера детали журнала, т.е. 741500881101_ 003 .log, чтобы получить что-то вроде этого:

738500861101_001.log
738500861101_002.log
738500861101_003.log
666500872101_001.log
666500872101_002.log
666500872101_003.log
666500872101_004.log        
741500881101_001.log
741500881101_002.log
741500881101_003.log

Не удается получить хорошие результаты, используя sort, пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Я решил эту проблему как часть изучения SPARK.Я не программист оболочки UNIX.Поэтому подумайте о решении проблемы с помощью spark

val logList = Array("666500872101_002.log","738500861101_003.log","738500861101_002.log","666500872101_001.log","741500881101_001.log","738500861101_001.log","741500881101_002.log","666500872101_003.log","741500881101_003.log","666500872101_004.log")

val logListRDD = sc.parallelize(logList)
logListRDD.map(x=>((x.substring(4,8), x.slice(x.indexOfSlice("_") +1, x.indexOfSlice("."))),x)).sortByKey().values.collect.take(20)

Выход:

Array [String] = Array (738500861101_001.log, 738500861101_002.log, 738500861101_003.log, 666500872101_001.log, 666500872101_002.log, 666500872101_003.log, 666500872101_004.log, 741500881101_001.log, 741500881101_002.log, 741500881101_003.log)

объяснение того, что я сделал

* параллельный(logList) - это шаг для создания RDD, который является основным компонентом spark.

map (x => ((x.substring (4,8), x.slice)(x.indexOfSlice ("_") +1, x.indexOfSlice ("."))), x)) - извлекает содержимое из массива и генерирует пару ключ-значение.В нашем случае значением является значение ***. Log, а ключом является массив подстрок, по которому мы хотели отсортировать (0086, 001).Пара KeyValue будет выглядеть как [(0086, 001), 738500861101_001.log]

sortByKey () - сортирует данные на основе сгенерированного выше ключа

значения - получает значение, соответствующее клавише

collect.take (20) -> Отображение o / p на экране

0 голосов
/ 11 мая 2018

Вы можете использовать команду sort со следующими параметрами:

sort -n -k1.5,1.8 -n -k1.14,1.16 fileToSort.log

Опции:

  • -n для числовой сортировки
  • -k1.5,1.8 и -k1.14,1.16 для определения ключей сортировки

Пример:

$ sort -n -k1.5,1.8 -n -k1.14,1.16 fileToSort 
738500861101_001.log
738500861101_002.log
738500861101_003.log
666500872101_001.log
666500872101_002.log
666500872101_003.log
666500872101_004.log
741500881101_001.log
741500881101_002.log
741500881101_003.log
...