awk를 사용하는 하위 집합 데이터

awk를 사용하는 하위 집합 데이터

awk를 사용하여 데이터의 하위 집합을 만들고 싶습니다. test라는 파일이 있다고 가정해 보겠습니다.

IP MAC Bandwidth etc etc

192.1.1.1 ff:ff:ff:ff 5.421M
192.1.2.3 ff:ff:ff:f3 5.120M
192.1.2.5 ff:ff:ff:f1 5.100M

stuff I don't want to be selected

대역폭 값만 선택하고 싶습니다. (M과 엔딩을 제거할 수 있으면 더 좋을 것입니다. 어쩌면 sed를 사용할 수도 있습니다. 방법은 모르겠지만 그게 주요 문제는 아닙니다.)

내가 현재 하고 있는 최고의 하위 세트는 다음과 같습니다.

awk '{print $3}' test

출력은 다음과 같습니다:

Bandwidth

5.421M
5.120M
5.100M

dont

하지만 나는 다음과 같이 되기를 원합니다:

5.421
5.120
5.100

"M"이 거기에 있었다면 문제가 되지 않았지만 그게 아이디어였습니다. awk에 대한 정보를 수집하고 몇 가지 시도를 해봤지만 아직 해결책을 찾지 못했습니다.

답변1

정확한 답변을 얻으려면 질문에 대해 좀 더 구체적이어야 합니다. 그러나 awk 문의 일반적인 구문은 다음과 같습니다.

PATTERN { ACTION }

ACTION은 PATTERN과 일치하는 행에서만 실행됩니다. 따라서 PATTERNACTION 블록을 사용하여 행별로 하위 집합을 사용하고 열별로 하위 집합을 사용할 수 있습니다. 예를 들어, 귀하의 의견을 바탕으로 다음을 사용할 수 있습니다.

> awk '/^[0-9]/ {print $3 }' INPUTFILE
5.421M
5.120M
5.100M

다음은 PATTERN첫 번째 문자가 0에서 9 사이의 정수인 모든 줄과 일치하는 정규식입니다. 제거하려면 M예를 들어 다른 명령으로 파이프하거나 cuonglm의 답변에 있는 명령을 tr사용할 수 있습니다.gsub

awk '/^[0-9]/ { gsub(/M/, "", $3); print $3 }' INPUT_FILE

답변2

인쇄하기 전에 숫자나 점이 아닌 모든 것을 제거할 수 있습니다.

$ awk '{gsub(/[^[:digit:].]/,"",$3);print $3}' file
5.421
5.120
5.100

답변3

텍스트로 뭔가를 할 계획이 없다면 sed사용하는 것이 더 합리적으로 보입니다.

sed -En 's/.* (\S+)M$/\1/p'

-E\(, \+,백슬래시 등을 사용하는 메타 문자를 피합시다 .

-n 이 순서가 아니면 출력을 억제합니다.p

s/바꾸다

.*공백이 있는 줄의 첫 번째 부분(탐욕 때문에 마지막 공백)

()"역방향 연결" - 다음과 같이 괄호 안의 패턴을 호출할 수 있습니다.\number

\S공백이 아닌 모든 기호(공백을 제외한 모든 :blank:기호 )

+하나 이상의 이전 기호

M$줄 끝의 "M"

/p교체할 라인을 인쇄하세요.

"전체 줄을 대괄호 안의 패턴으로 바꾸고 그러한 대체 항목이 있는 줄만 인쇄합니다"를 의미합니다.

답변4

awk에서 match 기능을 사용할 수도 있습니다.

awk '{match($3, /[0-9]+.[0-9]+/,arr)}{ print arr[0]}' file

관련 정보