Расширение LVM на существующий раздел в среде vmware

Предполагая, что текущий каталог содержит все файлы CSV и все они имеют суффикс .csvимени файла:

for file in./*.csv; do
    head -n 200 "$file" >"$file.200"
done

При этом первые 200 строк каждого CSV-файла выводятся в новый файл с использованием headи перенаправления. Имя нового файла такое же, как и у старого, но с добавлением .200в конце имени. Нет проверки, существует ли уже новое имя файла или нет.

Если вы хотите заменить оригиналы:

for file in./*.csv; do
    head -n 200 "$file" >"$file.200" &&
    mv "$file.200" "$file"
done

&&в конце команды headделает так, что mvне будет запускаться, если с запуском headвозникли проблемы.

Если ваши CSV-файлы разбросаны по подкаталогам в текущем каталоге, используйте shopt -s globstar, а затем замените шаблон ./*.csvв цикле на ./**/*.csv. Это найдет любой CSV-файл в текущем каталоге или ниже и выполнит операцию над каждым. Шаблон подстановки **«рекурсивно» соответствует подкаталогам, но только если установлен параметр оболочки globstar.


Для CSV-файлов, содержащих данные со встроенными символами новой строки, описанное выше не будет работать должным образом, поскольку вы можете обрезать запись. Вместо этого вам придется использовать какой-нибудь инструмент, поддерживающий CSV -, который сделает эту работу за вас.

Далее используется CSVkit, набор инструментов командной строки -для синтаксического анализа и общей работы с CSV-файлами, вместе с jq, инструментом для работы с файлами JSON.

В комплекте CSV нет инструмента, который может обрезать CSV-файл в определенной точке, но мы можем преобразовать CSV-файлы в JSON и использовать jqдля вывода только первых 200 записей:

for file in./*.csv; do
    csvjson -H "$file" | jq -r '.[:200][] | map(values) | @csv' >"$file.200" &&
    mv "$file.200" "$file"
done

Учитывая некоторый CSV-файл, подобный приведенному ниже короткому примеру,

a,b,c
1,2,3
"hello, world",2 3,4
"hello
there","my good
man",nice weather for ducks

команда csvjsonвыдаст

[
  {
    "a": "a",
    "b": "b",
    "c": "c"
  },
  {
    "a": "1",
    "b": "2",
    "c": "3"
  },
  {
    "a": "hello, world",
    "b": "2 3",
    "c": "4"
  },
  {
    "a": "hello\nthere",
    "b": "my good\nman",
    "c": "nice weather for ducks"
  }
]

Инструмент jqзатем примет это и для каждого объекта в массиве (, ограниченном первыми 200 объектами ), извлечет значения в виде массива и отформатирует его как CSV.

Вероятно, это преобразование можно выполнить напрямую с помощью csvpy, другого инструмента в CSVkit, но поскольку мои навыки работы с Python отсутствуют -, я не буду пытаться придумать решение, которое это сделает.

0
19.10.2020, 09:12
0 ответов

Теги

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