csv - 截断 CSV header 名称

标签 csv awk sed

我正在寻找一种相对简单的方法来将 CSV header 名称截断为给定的最大长度。例如这样的文件:

one,two,three,four,five,six,seven
data,more data,words,,,data,the end

可以将所有标题名称限制为最多 3 个字符并变为:

one,two,thr,fou,fiv,six,sev
data,more data,words,,,data,the end

要求:

  • 只有第一行受到影响
  • 我不知道标题是什么,所以它必须动态读写值和长度

我用 awk 和 sed 尝试了一些东西,但我都不精通。我找到的最接近的是这个片段:

csvcut -c 3 file.csv |
sed -r 's/^"|"$//g' |
awk -F';' -vOFS=';' '{ for (i=1; i<=NF; ++i) $i = substr($i, 0, 2) } { printf("\"%s\"\n", $0) }' >tmp-3rd

但它专注于列,而且感觉比使用 csvcut 所必需的更复杂。

感谢任何帮助。

最佳答案

使用 GNU sed:

sed -E '1s/([^,]{1,3})[^,]*/\1/g' file

输出:

one,two,thr,fou,fiv,six,sev
data,more data,words,,,data,the end

参见:man sedThe Stack Overflow Regular Expressions FAQ

关于csv - 截断 CSV header 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70294581/

相关文章:

awk - 使用一个 awk 命令在匹配字符串中搜索字符串

regex - sed 正则表达式提取字段并构建新的

bash - impala-shell 将奇数控制字符插入到对非交互式查询的响应中

regex - 如何找到第一次出现的重复并将其转换为文本

php - 在mysql中导入数据时自动插入列

php - 导入在实际字段中有换行符的 CSV

c++ - 如何回到 csv 文件第一行的末尾?

regex - Grep for word and line before match

sed - 如何使用 sed 将每个换行符 (\n) 替换为空格?

php - CSV 导出和下载导致内部服务器错误