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