Вычислить или суммировать метки времени между строками в awk

Sugerencia usando GNUdate:

yesterday=$( date -d yesterday +%F )
drop_dir=/tmp/drop
archive_dir=/tmp/arch

mkdir -p "$archive_dir"

mv -f "$drop_dir"/*"$yesterday"*.gz "$archive_dir"

Aquí, "$drop_dir"/*"$yesterday"*.gzse expandirá a todos los archivos que coincidan con el patrón dado. Esto funcionará siempre que el patrón se expanda a varios miles de caracteres, en cuyo caso el shell se quejará con "Lista de argumentos demasiado larga".

O, si realmente desea hacer un bucle para generar cada nombre de archivo a medida que se mueven (solo el comando mvde arriba se cambia a lo siguiente):

for name in "$drop_dir"/*"$yesterday"*.gz; do
    [ -f "$name" ] || continue
    mv "$name" "$archive_dir"
    printf 'Moved "%s"\n' "$name"
done

Aquí, el ciclo foriterará sobre los mismos nombres que se usaron en la variación anterior, pero uno por uno. Cada nombre se mantendrá en $name(, que incluye el nombre del directorio ). Si no hubiera archivos que coincidieran con el patrón, el patrón permanecerá sin expandir. Es por eso que hacemos una prueba explícita para asegurarnos de que $namerealmente corresponda a un archivo existente antes de moverlo.

O, confind:

find "$drop_dir" -maxdepth 1 -type f -name "*$yesterday*.gz" \
    -print -exec mv {} "$archive_dir" ';'

Aquí, findtomará los nombres de $drop_dirque corresponden a los archivos normales(-type f)y que coinciden con el patrón dado a -name. Para cada uno de estos nombres, se llama mvpara mover el archivo a la carpeta de destino. Sin embargo, antes de llamar a mv, -printenumerará el nombre del archivo (, incluida la ruta )en la terminal.

La opción -maxdepth 1evita que findrecurra a subcarpetas de $drop_dir.

0
06.03.2019, 16:54
2 ответа

Использовать две команды awk

awk '{print $NF}' file |awk '{a+=$(NF-1)*60+$(NF);printf"%d:%02d:%02d\n",a/3600,a%3600/60,a%3600%60}'

Первый awk извлекает поле las файла, а второй awk выполняет нужные вам действия.

это работает независимо от того, содержит ли файл только время или нет, если время является последним полем в строке

0
28.04.2021, 23:36

Это проблема, с которой вы сталкиваетесь :, когда FS=" :", ваше первое поле — "1. Track 01 05", и когда вы используете эту строку в арифметическом контексте, первое не -цифра усекает число, поэтому значение минут равно «1». Вам нужно использовать пробел или двоеточие в качестве разделителя полей, но тогда любой завершающий пробел означает, что у вас есть лишние пустые поля.

Я бы сделал

awk '
    BEGIN {h = m = s = 0}
    function add_time(min, sec) {
        s += sec
        m += min
        while (s >= 60) {s -= 60; m++}
        while (m >= 60) {m -= 60; h++}
    }
    {
        split($NF, t, /:/)
        add_time(t[1], t[2])
        printf "%d:%02d:%02d\n", h, m, s
    }
' file
0
28.04.2021, 23:36

Теги

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