표준 텍스트 처리 도구를 사용하여 공백으로 구분된 테이블을 CSV로 변환

표준 텍스트 처리 도구를 사용하여 공백으로 구분된 테이블을 CSV로 변환

다음과 같은 데이터 테이블이 있습니다.

ssh     22/tcp  0.182286        # Secure Shell Login
linuxconf   98/tcp  0.000088 
tacnews    98/udp   0.000560    # TAC News

다음 형식의 CSV 파일을 생성하고 싶습니다.

ssh,22,tcp,Secure Shell Login
linuxconf,98,tcp,
tacnews,98,udp,Tac News

십진수를 버리고 "#"이 있는 경우 설명을 포함하지 않습니다.

데이터를 여러 필드로 봅니다(가짜 정규식은 용서하세요).

^{1}\s+{2}/{3}\s+{4}\s+# {5}$  

이를 위해 다음을 출력합니다.

{1},{2},{3},{5}  

이를 수행하는 가장 쉽고 가장 적절한 도구는 무엇입니까? 이를 달성하기 위한 구문에 대한 도움을 주시면 감사하겠습니다.

답변1

아마도 이런 종류의 문제를 해결하기 위한 가장 좋은 도구는 입니다 sed. 다음은 확장 정규식을 사용하는 실제 예제입니다.

sed -E 's:^([^ ]*)\s+([^/]*)/([^ ]*)\s+[^ ]*\s*#?\s*(.*):\1,\2,\3,\4:' file

또는 입력 내용이 탭으로 구분된 경우:

sed -E 's:^([^[:space:]]*)\s+([^/]*)/([^[:space:]]*)\s+[^[:space:]]*\s*#?\s*(.*):\1,\2,\3,\4:' file

산출:

ssh,22,tcp,Secure Shell Login
linuxconf,98,tcp,
tacnews,98,udp,TAC News

설명하다

  • s:::콜론을 표현식 구분 기호로 사용
  • ^([^ ]*)줄 시작 부분의 공백이 아닌 문자 시퀀스와 일치하는 첫 번째 캡처링 그룹
  • \s+공간을 무시하다
  • ([^/]*)두 번째 캡처 그룹은 슬래시와 일치합니다.
  • /슬래시 무시
  • ([^ ]*)세 번째 캡처 그룹은 공백이 아닌 문자의 시퀀스와 일치합니다.
  • \s+공간을 무시하다
  • [^ ]*소수점 무시
  • \s*#?\s*공백 및 선택적 해시 무시
  • (.*)네 번째 캡처 그룹, 나머지 라인

답변2

저는 Perl을 사용하겠습니다. 공백을 메우는 정규식의 개요를 설명했습니다.

perl -lne '
    / (\S+)     \s+      # non-whitespace followed by whitespace
      (\d+)     \/       # digits followed by slash
      (\S+)     \s+      # non-whitespace followed by whitespace
      (\S+)     \s*      # non-whitespace followed by optional whitespace
      (?:\#\s)? (.*)     # possibly a hash+space and whatever follows
    /x and print "$1,$2,$3,$4,$5"' file

관련 정보