Как добавить префикс ко всем числам на основе числа di git наибольшего числа? - PullRequest
0 голосов
/ 20 июня 2020

Я создал список каталогов моего диска Google в индексе облачных вычислений. Лог c сортировки файлов по какой-то причине выглядит довольно странно. Он сортирует файлы последовательно от 0 для каждого di git, и если di git число совпадает, он проверяет второе di git от 0 и так далее ..

В настоящее время отсортированные файлы отображаются как это сверху вниз 1, 10, 100, 101..109, 11, 110, 111..119, 12

Есть простой способ исправить это, но мне нужно вручную переименовать каждый файл и добавьте префикс 0 на основе количества цифр наибольшего числа, но их сотни / тысячи. Я буду использовать javascript для переименования всех моих файлов, он допускает ввод новых имен в следующем формате (oA - это массив, в который я ввожу новые имена для каждого файла).

Мне было интересно, если любая функция awk / perl / regex может дать ожидаемый результат при выполнении в file.txt

Пример 1

cat file.text

oA=['Lecture 7 - Topic.mp4','Lecture 56 - Topic.mp4','Lecture 3 - Topic.mp4','Lecture 4 - Topic.mp4']

Ожидаемый результат

oA=['Lecture 07 - Topic.mp4','Lecture 56 - Topic.mp4','Lecture 03 - Topic.mp4','Lecture 04 - Topic.mp4']

Пример 2

cat file.txt

oA=['Lecture 3 - Topic.mp4','Lecture 116 - Topic.mp4','Lecture 46 - Topic.mp4','Lecture 112 - Topic.mp4']

Ожидаемый результат

oA=['Lecture 003 - Topic.mp4','Lecture 116 - Topic.mp4','Lecture 046 - Topic.mp4','Lecture 112 - Topic.mp4']

Пример 3

cat file.txt

oA=['Lecture 8 - Topic.mp4','Lecture 1165 - Topic.mp4','Lecture 667 - Topic.mp4','Lecture 12 - Topic.mp4']

Ожидаемый результат

oA=['Lecture 0008 - Topic.mp4','Lecture 1165 - Topic.mp4','Lecture 0667 - Topic.mp4','Lecture 0012 - Topic.mp4']

Как вы могли заметить, только префикс 0 должны быть добавлены к каждому числу по мере необходимости, порядок лекций по-прежнему сохраняется (это важно)

Если бы мне пришлось объяснять это так ...

1) Возьмите наибольшее число после слово Лекция и проверьте его количество цифр. 2) Теперь все числа будут иметь такое же количество цифр, что и наибольшее число, при необходимости добавьте нули префикса к каждому числу

Ответы [ 3 ]

2 голосов
/ 20 июня 2020

В Perl решение сводится к оператору повторения x. В приведенном ниже коде ключевой строкой является

my $padding = "0" x ($maxlen-$thislen);

В документации Perl по операторам говорится о x: «В скалярном контексте или если левый операнд не заключен в круглые скобки, он возвращает строку, состоящую из левого операнда, повторенного указанное количество раз. правым операндом. "

Таким образом, он будет повторять di git 0 достаточно раз, чтобы превратить число длины $thislen в число длины $maxlen.

Код дает правильный результат для каждого из примеров.

$ cat file.text
oA=['Lecture 7 - Topic.mp4','Lecture 56 - Topic.mp4','Lecture 3 - Topic.mp4','Lecture 4 - Topic.mp4']
iA=['Lecture 3 - Topic.mp4','Lecture 116 - Topic.mp4','Lecture 46 - Topic.mp4','Lecture 112 - Topic.mp4']
anyname=['Lecture 8 - Topic.mp4','Lecture 1165 - Topic.mp4','Lecture 667 - Topic.mp4','Lecture 12 - Topic.mp4']

$ ./padding.pl file.text
oA=['Lecture 07 - Topic.mp4','Lecture 56 - Topic.mp4','Lecture 03 - Topic.mp4','Lecture 04 - Topic.mp4']
iA=['Lecture 003 - Topic.mp4','Lecture 116 - Topic.mp4','Lecture 046 - Topic.mp4','Lecture 112 - Topic.mp4']
anyname=['Lecture 0008 - Topic.mp4','Lecture 1165 - Topic.mp4','Lecture 0667 - Topic.mp4','Lecture 0012 - Topic.mp4']

Вот полный код, который выполняет запрошенную задачу.

#!/usr/bin/perl

# Usage: 
#   padding.pl [file1.text [file2.text [...]]]

use List::Util qw(max);
use strict;

my $varname = "";
my @oA = ();

# loop over lines in input file(s)
while ($_ = <>) {

  # Put data in @oA array.
  # You'll need to decide what assumptions to make 
  # about your input data.
  chomp;
  ($varname) = /^([^=]*)=/;
  s/^$varname=//g;
  if (/^\['.*'\]$/)  {
    s/^\['|'\]$//g;
    @oA = split( /','/, $_ );
  }

  # extract the numbers, find the max
  my @oA_nums = map { /Lecture (\d+)/; $1 } @oA;
  my $maxlen = max map(length,@oA_nums); # pad all oA to this length

  # replace the numbers with padded versions
  foreach my $i (0 .. $#oA) {                 # loop from 0 to "num elements - 1"
    my $thislen = length($oA_nums[$i]);
    my $padding = "0" x ($maxlen-$thislen);   # THIS IS IT!
    my $padded_num = $padding . $oA_nums[$i];

    $oA[$i] =~ s/Lecture \d+/Lecture $padded_num/;
  }

  print "$varname=['";
  print join "','", @oA;
  print "']\n";

}

1 голос
/ 20 июня 2020

Альтернативное решение - Perl.

#! /usr/bin/perl
use List::Util qw(max) ;

while ( <> ) {
        if ( s/^iA=/oA=/ ) {
                my $maxlen = max(map { length } /Lecture (\d+)/g) ;
                s/(Lecture )(\d+)/sprintf("%s %0${maxlen}d", $1, $2)/eg ;
                print ;
        }
}
1 голос
/ 20 июня 2020

Данный сценарий будет запущен в GoogleApp, см. Следующее Javascript решение. Будет создана oA, из iA

  1. найти самую длинную последовательность
  2. l oop в документе, заменить последовательность на последовательность с нулями, вставить oA

Журнал console.log предназначен для проверки. Удалите и используйте метод переименования, который у вас уже есть после тестирования.

iA=['Lecture 7 - Topic.mp4','Lecture 56 - Topic.mp4','Lecture 3 - Topic.mp4','Lecture 4 - Topic.mp4']
let seq_len=1

// Collect sequence, find largest
for (doc of iA) {
        let seq = doc.match("\\d+")[0]
        if ( seq.length > seq_len ) seq_len = seq.length
}

oA=[]
for (doc of iA) {
        let old_seq = doc.match("\\d+")[0]
        let new_seq = old_seq
        while ( new_seq.length < seq_len ) new_seq = "0" + new_seq
        oA.push( doc.replace(old_seq, new_seq))
}

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