csvファイルを列に変換し、最初の行の各ラベルの下にダッシュを追加したいです(下線が引かれているため)。点線は各ラベルの長さと同じです(ラベルは複数の単語で構成できます)。
例は次のとおりです。
Full name age country
--------- --- -------
答え1
ダッシュをどこに追加するかわからない。 「全体」と「名前」の間のスペースが列の区切り文字ではないかどうかはどうすればわかりますか?空白以外の各文字の下にダッシュを追加するには、次のawk one-linerを使用できます。
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
ファイルがスペースで区切られている場合、スペースを含むフィールドを処理するのは困難です。
実際、「ステートメント」などのスペースを持つフィールドは、2つの異なるフィールドとして扱われます。
前のコードを調整しBEGIN{FS=OFS=" "}
てawkと入力すると、スペースで区切られたファイルが印刷されます。
name1 name2 full name3 name4
----- ----- ---- ----- -----
value1 value2 value3 value4
ヒント:各フィールドの長さと同じ数のダッシュを作成するには、元のヘッダー行の下の2番目のヘッダー行に同じフィールド(name1など)を挿入し、各フィールドのすべての文字をダッシュに置き換えます。これは各基本ヘッダーフィールドの長さと同じ点線文字列を生成します(つまり、name1はgensub関数を使用して-----になります)。