截断 CSV Header 名称

Truncate CSV Header Names

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

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

可以将所有 header 个名称限制为最多 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", [=13=]) }' >tmp-3rd

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

感谢任何帮助。

使用 GNU sed:

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

输出:

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

参见:man sedThe Stack Overflow Regular Expressions FAQ

使用您显示的示例,请尝试执行以下 awk 程序。简单的解释是,将字段分隔符和输出字段分隔符设置为 , 然后在第一行中根据要求将第一行的每个字段缩短为 3 个字符并打印它们(第一行最后一个字段之后的新行),打印其余行保持原样。

awk '
BEGIN { FS=OFS="," }
FNR==1{
  for(i=1; i<=NF; i++){
    printf("%s%s",substr($i, 1, 3),(i==NF?ORS:OFS))
  }
  next
}
1
' Input_file