Форматирование и заполнение пропущенных данных на основе столбца

Это можно сделать в одной строке, хотя для разборчивости я разобью. Я повторяю имя файла и модифицирую его, используя sed в целевом аргументе mv:

for i in *Bostjan*; do
  mv $i $(echo $i | sed s@Bostjan@@)
done
2
12.04.2018, 21:16
1 ответ
BEGIN { OFS = FS = "," }

FNR==1 {
    for (i = 2; i <= NF; ++i) {
        split($i, a, "=")
        f[i] = a[1]
    }
}

{
    for (i = 2; i <= NF; ++i) {
        split($i, a, "=")
        if (a[1] != f[i]) {
            for (j = NF + 1; j > i; --j)
                $j = $(j - 1)
            $i = ""
        }

        $i = sprintf("%10s", $i)
    }

    print
}

Эта awkпрограмма предполагает, что первая строка входного файла является правильной в том смысле, что она содержит все поля в правильных позициях.

В приведенном ниже тексте «все поля» и «поля» относятся ко всем полям, кроме первого, которое остается нетронутым.

Только для первой строки считываются биты перед =в полях и сохраняются в массиве fдля соответствующей позиции поля.

Для всех строк выполняется одинаковое разбиение содержимого полей на =и сравнение бита перед =с тем, что массив fговорит, что он должен быть. Если есть несоответствие, поля с этого момента «сдвигаются вправо» на одну позицию, а текущее поле очищается.

Затем все поля переформатируются в выровненную по правому краю -строку из 10 символов, и печатается вся модифицированная запись (строки ).

Запуск на примере данных:

$ awk -f script.awk file
2018-03-13 02:09:12,    AB=123,      BC=6,   CAB=Jax,   XYZ=Xax
2018-03-13 02:09:13,    AB=234,      BC=6,   CAB=Jax,   XYZ=Ram
2018-03-13 02:11:03,    AB=567,      BC=6,         ,  XYZ=Xulu
0
27.01.2020, 22:33

Теги

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