我有大约50个非常大的csv文件,它们有数千行。
而且我只想保留每行的前200行-如果生成的文件覆盖原始文件,我可以。
我应该使用什么命令来执行此操作?
假设当前目录包含所有CSV文件,并且它们都具有.csv
文件名后缀:
for file in ./*.csv; do
head -n 200 "$file" >"$file.200"
done
使用head
和重定向将每个CSV文件的前200行输出到新文件。新文件的名称与旧文件的名称相同,但.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技能,因此我不会尝试提出一种解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句