여러 줄의 텍스트를 쉼표 구분 기호를 사용하여 한 줄로 구문 분석합니다.

여러 줄의 텍스트를 쉼표 구분 기호를 사용하여 한 줄로 구문 분석합니다.

speedtest-cli 도구를 사용하여 대역폭을 추적하고 싶습니다. 매 시간마다 다음과 같은 텍스트 파일을 만들 수 있습니다.

2020-10-30-09:21:28
Hosted by ISP (City, ST) [141.56 km]: 3.549 ms
Download: 892.81 Mbit/s
Upload: 940.12 Mbit/s

내 목표는 기록 및 그래프 작성 요구에 따라 이 정보를 저장하는 일종의 테이블을 만드는 것입니다. CSV 파일이 좋을 것 같아요. 이 4줄의 텍스트를 구문 분석하여 특정 데이터를 추출하고 출력을 쉼표 구분 기호를 사용하여 한 줄로 리디렉션하고 기존 파일에 추가하려면 어떻게 해야 합니까? 즉:

Date, Response Time, Download (Mbit/s), Upload (Mbit/s)
2020-10-30-09:21:28, 3.549, 892.81, 940.12

답변1

쉼표 뒤에 공백을 두는 것은 다소 특이하지만 간단하게 다음과 같이 할 수 있습니다.

{ awk '{printf "%s%s", NR==1 ? "": ", ", $(NF-1)}' input; echo; } >> output

또는 후행 쉼표를 사용할 수 있는 경우:

awk '{print $(NF-1)} END{printf"\n"}' ORS=', ' input >> output

첫 번째 솔루션은 printf를 사용하여 각 줄의 두 번째에서 마지막 레코드를 인쇄합니다. 이는 약간 취약하지만 입력 샘플에 적합합니다. 또한 전체 줄을 처리하는 awk 기능을 활용하므로 $0한 줄에 레코드가 하나만 있으면 전체 줄을 인쇄합니다. 이것은 NR==1 ?"":", "첫 번째 줄을 제외한 모든 줄에 구분 기호를 인쇄하는 삼항 연산자입니다. 이는 개행 문자를 인쇄하지 않으므로 echo개행 문자를 얻기 위해 an으로 끝납니다 .

두 번째 솔루션은 각 줄(또는 필드가 하나만 있는 전체 줄)의 두 번째 레코드를 다시 인쇄하지만 END 절을 사용하여 마지막 줄 바꿈을 인쇄하고 레코드 구분 기호를 사용하여 쉼표를 삽입합니다. 이로 인해 원치 않는 후행 개행이 발생합니다. 이는 최종적이고 깔끔한 솔루션에 영감을 주었습니다.

awk 'NR==4{ORS="\n"}{print $(NF-1)}' ORS=', ' input

여기서는 끝에 개행 문자를 추가하는 대신 4행을 읽을 때 출력 레코드 구분 기호를 변경합니다.

답변2

pcregrep정규식을 사용하면 여러 줄 입력에서 데이터를 쉽게 추출하고 보고할 수 있습니다.

여기:

<input.txt pcregrep --om-separator=', ' -o1 -o2 -o3 -o4 -M \
  '^(.*)\n.*?(\S+) ms\n.*?(\S+) Mbit/s\n.*? (\S+) Mbit/s$'

perlp또는 ( in ) 과 동일합니다 pcregrep.

perl -l -0777 -ne 'print join ", ", $1, $2, $3, $4 if 
  m{^(.*)\n.*?(\S+) ms\n.*?(\S+) Mbit/s\n.*? (\S+) Mbit/s$}'

관련 정보