Это можно сделать в одной строке, хотя для разборчивости я разобью. Я повторяю имя файла и модифицирую его, используя sed в целевом аргументе mv:
for i in *Bostjan*; do
mv $i $(echo $i | sed s@Bostjan@@)
done
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