【发布时间】:2022-01-14 13:26:11
【问题描述】:
我正在寻找一种相对简单的方法来将 CSV 标头名称截断为给定的最大长度。例如像这样的文件:
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 尝试了一些东西,但都不精通。我找到的最接近的是这个 sn-p:
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 更复杂。
感谢任何帮助。
【问题讨论】:
-
与
awk:awk 'BEGIN{ FS=OFS="," } NR==1{ for(i=1; i<=NF; i++){ $i=substr($i, 1, 3) } }1' file -
谢谢@cyrus。我实际上需要添加一些逻辑来放回任何被截断的双引号,并确保不以空格结尾。它有点乱,但这是一个 awk 业余爱好者想出的:
awk 'function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s } BEGIN{ FS=OFS="," } NR==1{ for(i=1; i<=NF; i++){ if(length($i)>62) { $i=rtrim(substr($i, 1, 62))"\"" } else { $i } } }1' file(现在修剪为 62 个字符)