다음 txt 테이블을 csv 테이블 형식으로 변환

다음 txt 테이블을 csv 테이블 형식으로 변환

다음 형식의 유닉스 테이블이 있고 출력으로 숨겨져 있습니다.

+--------------------------+-------------------------+-+
|           col_name       |        type             |   
+--------------------------+-------------------------+-+
| Name                     |    String               |
| Date                     | Fri 29 13:17:2020       |
+--------------------------+-------------------------+-+

산출:

"col_name","type"
"Name","String"
"Date","Fri 29 13:17:2020"

어떤 도움이라도 대단히 감사하겠습니다.

답변1

이 시도:

input ()
{
  cat <<EOF
+--------------------------+-------------------------+-+
|           col_name       |        type             |
+--------------------------+-------------------------+-+
| Name                     |    String               |
| Date                     | Fri 29 13:17:2020       |
+--------------------------+-------------------------+-+
EOF
}

input |
  tr -d '|+-' |                # remove decoration
  grep -v ^$ |                 # remove empty lines
  while read first rest; do    # read first token and rest of the line
    printf '"%s","%s"\n' \
           "$first" "$rest"    # format as required
  done

답변2

소스 코드는 콘솔의 dbase 클라이언트에 대한 응답과 유사합니다. 그러나 아마도 메모장으로 유닉스 텍스트를 열 때 줄 끝과 많은 공백이 손실됩니다. 원시 형식(비례 글꼴)을 사용하면 소스가 보기 좋은 테이블을 형성합니다.

+--------------------------+-------------------------+-+ 
| col_name                 | type                    |
+--------------------------+-------------------------+-+ 
| Name                     | String                  | 
| Date                     | Fri 29 13:17:2020       | 
+--------------------------+-------------------------+-+

실제 내용이 무엇인지 확인하려면 16진수 편집기에서 텍스트 파일을 확인하세요. 요청한 형식으로 변환하는 명령을 작성할 수 있습니다. (형식상 코멘트로 쓸 수 없습니다. 이게 뭔가요?)

답변3

모든 필드 값에 따옴표가 포함될 수 없는 경우 다음 awk프로그램이 작업을 수행해야 합니다(결과는 정규화되지 않은 CSV가 됩니다).

awk -F'|' -v OFS="," '/^\+/{next} {for (i=2;i<NF;i++) {gsub(/^ *| *$/,"",$i); printf("\"%s\"%s",$i,i<(NF-1)?OFS:ORS)}}' input.txt

이것은 것이다

  • |필드 구분자 로 처리됨
  • 다음으로 시작하는 줄은 모두 무시하세요.+
  • |시작하지 않는 줄의 첫 번째와 마지막 "필드"를 무시하고(첫 번째와 마지막 뒤의 "내용"이기 때문에 비어 있습니다) +나머지 필드를 인쇄하고 공백을 제거하고 다음으로 바꿉니다. 큰따옴표는 필드 구분 기호와 함께 따옴표로 묶입니다 ,.

셀 내의 선행 및 후행 공백은 순전히 외관상의 공백이며 입력 파일에 빈 줄이 포함되어 있지 않다고 가정합니다.

관련 정보