如何使用CSVKit截断列的长度?
定义如下:
这应该正确地处理转义(引用)列和新行。
例如:
First Header,Second Header
foo,
foo,b
foo,bar
foo,"bar"
foo,"""bar"
foo,"
bar"应该变成
First Header,Second Header
foo,
foo,b
foo,ba
foo,ba
foo,"""b"
foo,"
b"发布于 2022-07-14 19:51:59
这是一个使用csvsql的解决方案:
csvsql -d ',' --query 'SELECT "First Header" as "First Header",substr("Second Header",1,2) as "Second Header" FROM data' data.txtFirst Header,Second Header
foo,
foo,b
foo,ba
foo,ba
foo,"""b"
foo,"
b"发布于 2022-07-14 19:46:57
类似于R_31415's回答,但除了要修改或记住字段的顺序(在这方面也与罗伊玛的回答类似)之外,无需命名任何其他字段:
csvsql --query 'UPDATE stdin SET "Second Header" = substr("Second Header",1,2); SELECT * FROM stdin' <file一种稍微灵活一些的方法,允许我们在任何支持JSON的工具中插槽,对数据执行所需的转换:
csvjson创建CSV数据的JSON数组。jq读取JSON数据,并截断两个字符的Second Header值。in2csv读取JSON并创建CSV。csvjson file | jq 'map(."Second Header" |= .[:2])' | in2csv -f json给定问题中的CSV数据,csvjson的输出相当于
[
{
"First Header": "foo",
"Second Header": null
},
{
"First Header": "foo",
"Second Header": "b"
},
{
"First Header": "foo",
"Second Header": "bar"
},
{
"First Header": "foo",
"Second Header": "bar"
},
{
"First Header": "foo",
"Second Header": "\"bar"
},
{
"First Header": "foo",
"Second Header": "\nbar"
}
]然后,jq的输出将是
[
{
"First Header": "foo",
"Second Header": null
},
{
"First Header": "foo",
"Second Header": "b"
},
{
"First Header": "foo",
"Second Header": "ba"
},
{
"First Header": "foo",
"Second Header": "ba"
},
{
"First Header": "foo",
"Second Header": "\"b"
},
{
"First Header": "foo",
"Second Header": "\nb"
}
]最后的产出:
First Header,Second Header
foo,
foo,b
foo,ba
foo,ba
foo,"""b"
foo,"
b"https://unix.stackexchange.com/questions/709879
复制相似问题