유사한 파일의 첫 번째 줄 뒤에 새 줄을 삽입하는 방법

유사한 파일의 첫 번째 줄 뒤에 새 줄을 삽입하는 방법

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 함수를 사용하여 -----가 됩니다).

관련 정보