Предполагая, что текущий каталог содержит все файлы 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 отсутствуют -, я не буду пытаться придумать решение, которое это сделает.