![표준 텍스트 처리 도구를 사용하여 공백으로 구분된 테이블을 CSV로 변환](https://linux55.com/image/98388/%ED%91%9C%EC%A4%80%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%EC%B2%98%EB%A6%AC%20%EB%8F%84%EA%B5%AC%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EA%B3%B5%EB%B0%B1%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EB%B6%84%EB%90%9C%20%ED%85%8C%EC%9D%B4%EB%B8%94%EC%9D%84%20CSV%EB%A1%9C%20%EB%B3%80%ED%99%98.png)
다음과 같은 데이터 테이블이 있습니다.
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