Упорядочить разделы кодовых блоков по датам и месяцам

Нет, rsync не обнаруживает, что файл был перемещен, только то, что файл был удален, а другой был создан.

Как уже сказал @wurtel, опция --fuzzyможет помочь оптимизировать копирование данных (не только для перемещенных файлов, но также и тогда, когда вокруг )есть файлы с похожим содержимым.

Если вы хотите, чтобы старый экземпляр файла был удален, вам потребуется один из вариантов --delete.

3
26.08.2021, 10:10
2 ответа

Надеюсь, кто-нибудь поможет вам с ответом, который использует инструмент, поддерживающий XML -, но если нет, и если предположить, что ваш ввод действительно похож на образец, который вы предоставили -с использованием GNU awk дляsorted_in:

$ cat tst.awk
BEGIN { RS=""; ORS="\n\n"; FS="</?date>" }
{
    split($2,d,/[, ]+/)
    mthAbbr = substr(d[1],1,3)
    mthNr = ( index( "JanFebMarAprMayJunJulAugSepOcNovDec", mthAbbr ) + 2 ) / 3
    date = sprintf("%04d%02d%02d",d[3], mthNr, d[2])
    items[date] = $0
}
END {
    PROCINFO["sorted_in"] = "@ind_num_desc"
    for ( date in items ) {
        print items[date]
    }
}

$ awk -f tst.awk file
<item>
    <date>August 24, 2021</date>
    <p>Text</p>
</item>

<item>
    <date>July 20, 2021</date>
    <p>some text</p>
</item>

<item>
    <date>February 11, 2020</date>
    <p>more text</p>
</item>

или используя любой awk плюс сортировку и вырезание:

$ cat tst.awk
BEGIN { RS=""; FS="\n"; OFS="\t" }
{
    split($2,d,/[<>, ]+/)
    mthAbbr = substr(d[3],1,3)
    mthNr = ( index( "JanFebMarAprMayJunJulAugSepOcNovDec", mthAbbr ) + 2 ) / 3
    date = sprintf("%04d%02d%02d",d[5], mthNr, d[4])

    for (i=1; i<=NF; i++) {
        print date, NR, i, $i
    }
    print date, NR, i, ""
}

$ awk -f tst.awk file | sort -k1,1rn -k2,3n | cut -f4-
<item>
    <date>August 24, 2021</date>
    <p>Text</p>
</item>

<item>
    <date>July 20, 2021</date>
    <p>some text</p>
</item>

<item>
    <date>February 11, 2020</date>
    <p>more text</p>
</item>

Второй вариант будет лучшим выбором, если ваш входной файл огромен, так как он не требует, чтобы awk хранил весь входной файл в памяти перед его печатью. Он работает, украшая входные строки, чтобы добавить дату для каждой item, за которой следует номер текущей записи (item), за которым следует номер текущей строки в этом item, чтобы sortзатем можно было отсортировать по date, но сохранить исходный порядок ввода даже для повторяющихся дат,а затем cutпросто удаляет декорации, добавленные первым awkдля облегчения сортировки. Вот как выглядят результаты первых двух шагов, чтобы вы могли увидеть, что они делают:

$ awk -f tst.awk file
20210824        1       1       <item>
20210824        1       2           <date>August 24, 2021</date>
20210824        1       3           <p>Text</p>
20210824        1       4       </item>
20210824        1       5
20200211        2       1       <item>
20200211        2       2           <date>February 11, 2020</date>
20200211        2       3           <p>more text</p>
20200211        2       4       </item>
20200211        2       5
20210720        3       1       <item>
20210720        3       2           <date>July 20, 2021</date>
20210720        3       3           <p>some text</p>
20210720        3       4       </item>
20210720        3       5

$ awk -f tst.awk file | sort -k1,1rn -k2,3n
20210824        1       1       <item>
20210824        1       2           <date>August 24, 2021</date>
20210824        1       3           <p>Text</p>
20210824        1       4       </item>
20210824        1       5
20210720        3       1       <item>
20210720        3       2           <date>July 20, 2021</date>
20210720        3       3           <p>some text</p>
20210720        3       4       </item>
20210720        3       5
20200211        2       1       <item>
20200211        2       2           <date>February 11, 2020</date>
20200211        2       3           <p>more text</p>
20200211        2       4       </item>
20200211        2       5
4
26.08.2021, 12:20

Предполагая, что <item>являются частью некоторого контейнера<foo>

$ cat file.xml
<foo>
<item>
    <date>August 24, 2021</date>
    <p>Text</p>
</item>

<item>
    <date>February 11, 2020</date>
    <p>more text</p>
</item>

<item>
    <date>July 20, 2021</date>
    <p>some text</p>
</item>
</foo>

затем использование xqиз проекта yq для усиления jqвозможностей анализа и сортировки времени:

$ xq -x  '.foo.item |= sort_by(now - (.date | strptime("%B %d, %Y") | mktime))' file.xml
<foo>
  <item>
    <date>August 24, 2021</date>
    <p>Text</p>
  </item>
  <item>
    <date>July 20, 2021</date>
    <p>some text</p>
  </item>
  <item>
    <date>February 11, 2020</date>
    <p>more text</p>
  </item>
</foo>
4
26.08.2021, 13:29

Теги

Похожие вопросы