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
파일이 공백으로 구분된 경우 공백이 있는 필드를 처리하기가 어렵습니다.
실제로 "성명"과 같이 공백이 있는 필드는 두 개의 다른 필드로 처리됩니다.
이전 코드를 조정 BEGIN{FS=OFS=" "}
하고 awk를 입력하면 공백으로 구분된 파일이 인쇄됩니다.
name1 name2 full name3 name4
----- ----- ---- ----- -----
value1 value2 value3 value4
팁: 각 필드의 길이만큼 많은 대시를 생성하려면 원래 헤더 행 아래의 두 번째 헤더 행에 동일한 필드(예: name1)를 삽입하고 각 필드의 모든 문자를 대시로 바꿨습니다. 이는 각 기본 헤더 필드의 길이와 동일한 점선 문자열을 생성합니다(즉, name1은 gensub 함수를 사용하여 -----가 됩니다).