我将 csv 文件转换为列,现在我想在第一行的每个标签下添加破折号(因为它带有下划线)。虚线等于每个标签的长度(标签可能由多个单词组成)
这是一个例子:
Full name age country
--------- --- -------
答案1
目前尚不清楚您要在何处添加破折号 - 您如何知道“Full”和“name”之间的空格不是列分隔符?要在每个非空格字符下方添加破折号,您可以使用以下 awk 单行代码:
awk '{print} NR==1 {gsub(/[^\t ]/, "-"); print}'
要在空格下方添加破折号,但不在制表符下方添加破折号:
awk '{print} NR==1 {gsub(/[^\t]/, "-"); print}'
要在除空白之外的所有内容下方以及单独的空格下方添加破折号:
awk '{print} NR==1 {gsub(/[^ \t]/, "-"); while (sub(/- -/, "---")) {}; print}'
答案2
如果您的文件是逗号分隔文件,那么此代码将在从逗号分隔到空格分隔的初始转换期间执行您所需的操作,并且会正确处理由空格分隔的字段,因为分隔符是逗号:
awk 'BEGIN{FS=",";OFS=" "};
NR==1{
for (i=1;i<=NF;i++)
{
dashes=gensub(/./,"-","G",$i);
(h1 =="")?h1=$i:h1=h1 OFS $i;
(h2=="")?h2=dashes:h2=h2 OFS dashes;
};
{print h1;print h2}
}
NR>1{
$1=$1;print
}' <<<$'name1,name2,full name3,name4\nvalue1,value2,value3,value4'
name1 name2 full name3 name4
----- ----- ---------- -----
value1 value2 value3 value4
如果您的文件以空格分隔,则很难处理带有空格的字段。
实际上,像“全名”这样的间隔字段将被视为两个不同的字段。
通过调整BEGIN{FS=OFS=" "}
之前的代码并输入 awk,将打印一个空格分隔的文件
name1 name2 full name3 name4
----- ----- ---- ----- -----
value1 value2 value3 value4
提示:要生成与每个字段长度一样多的破折号,我只需在原始标题行下方的第二个标题行上插入相同的字段(即 name1),并用破折号替换每个字段的每个字符。这会生成与每个主标头字段长度相等的虚线字符串(即 name1 变为 ----- 使用 gensub 函数)