파일에서 각 줄의 첫 번째 단어를 얻고 싶습니다. 불행하게도 많은 줄이 공백으로 시작됩니다. 그래서 나는 다음과 같은 첫 번째 단어를 얻으려고 노력했습니다.
awk -F'[ \t]+' '{print $1}' < MyFile.txt
, 하지만 작동하지 않습니다. 이것을 시도했는데 echo " some string: here" | awk -F'[ \t]+' '{print $1}'
결과는 빈 줄입니다(빈 문자열이 인쇄되는 것 같습니다). 그렇다면 왜 이것이 작동하지 않습니까? awk 명령으로 작동하게 하고 구분 기호를 명시적으로 전달하고 싶습니다(교육 목적으로).
미리 감사드립니다.
답변1
최소한 공백이나 탭으로 구성된 Awk에 대한 필드 구분 기호를 지정합니다.
Awk에 문자열을 입력 some string: here
하고 첫 번째 필드를 인쇄하도록 요청합니다.
첫 번째 필드가 비어 있으므로 출력이 나오지 않습니다.
이 문자열의 필드는 다음과 같습니다.
<1:> <2:some> <3:string:> <4:here>
$ echo ' some string: here' | gawk 'BEGIN {OFS="|";FS="[ \t]+"}{print $1,$2,$3,$4}'
|some|string:|here
쉼표로 구분된 입력 데이터를 사용하는 것이 더 분명합니다.
,some,string:,here
구분 기호를 지정하지 않으면 Awk는 연속된 공백 및/또는 탭을 구분 기호로 사용합니다. 또한 줄 양쪽에 공백 문자가 있으면아니요행을 필드로 분할할 때 고려해야 할 사항입니다.
입력이 JSON 또는 YAML인 경우 Awk를 사용하는 대신 이러한 구조화된 문서 형식을 구문 분석하는 데 적합한 도구를 사용하는 것이 좋습니다. 이러한 도구에 대한 제안에는 jq
, yq
, mlr
및 jtc
기타가 포함됩니다.
답변2
awk에서는 기본 필드 구분 기호를 사용 -F " "
하거나 BEGIN{FS=" "}
특별한 규칙을 따릅니다.
- (1) 초기 공백과 마지막 공백을 무시합니다.
- (2) 나누기
[ \t]+
포인트 (1) - 선행 및 후행 공백 무시 -필드 구분 기호가 다음과 같은 경우에만 " "
.
이 동작은 실제로 우리가 기대하는 것입니다.
기본 awk '{print $1}'
작업 찾기 의 경우에도 마찬가지입니다 awk -F' ' '{print $1}'
.
입력 레코드 구분 기호(RS)에 대한 또 다른 유사한 규칙이 있습니다. RS=""
단락 구분을 나타내는 경우:
- (1) 구분 기호는 하나 이상의 빈 줄입니다.
- (2) 처음과 마지막 빈 줄을 무시합니다.
포인트 (2) - 앞/뒤 빈줄을 무시하세요 -입력 레코드 구분자가 정확히 ""인 경우에만 적용됩니다..
답변3
awk
필드를 할당할 때 선행 공백은 무시되며 기본 명령은 print입니다. 그래서 이것은 잘 작동할 것입니다:
awk '{print $1}'