":"를 awk 필드 구분자로 사용하는 방법은 무엇입니까?


243

주어진 다음 명령 :

echo "1: " | awk '/1/ -F ":" {print $1}'

왜 awk가 출력합니까?

1: 

답변:


382

"-F"는 awk 구문이 아닌 명령 행 인수입니다.

 echo "1: " | awk -F  ":" '/1/ {print $1}'

42
여기서 무지한 질문 : / 1 / 부분은 awk에게 숫자 1을 포함하는 행 (또는 더 정확한 레코드) 만 처리하도록 지시하는 것입니까?
rantsh

3
@rantsh Awk 구문은 다음과 같습니다 (pattern){action}. 경우 pattern(주로 조건문) 인 사실 , action실행됩니다. 를 pattern사용할 수 없으면 true묵시적입니다. 여기는 pattern것입니다 /1/어떤 상태 정규식되어 1현재 레코드에 일치$0
kvantour

62

프로그래밍 방식으로 수행하려면 FS변수를 사용할 수 있습니다 .

echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'

루프가 아닌 메인 루프에서 변경 하면 현재 라인이 이미 분할되었으므로 다음 라인 읽기에 BEGIN영향을 미칩니다 .


35

:구분자 로 설정하는 방법에는 여러 가지가 있습니다 .

awk -F: '{print $1}'

awk -v FS=: '{print $1}'

awk '{print $1}' FS=:

awk 'BEGIN{FS=":"} {print $1}'

모두 동일하며 1샘플 입력 "1 : 2 : 3"에 대한 반환 값은 다음과 같습니다 .

$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1

어느 쪽이 선호 되는가? 나는 BEGIN명령문이있는 최종 예제가 가장 정확 하다고 가정합니다 (전체 awk구문 과 일치 함 ).

1
@randomware 모두 괜찮습니다. BEGIN파일을 사용하여 모든 것을 저장하면 사용하는 경향이 있지만 -F하나의 라이너로 편리합니다.
fedorqui 'SO 중지 피해'

1
세 번째 경우와 다른 모든 경우에는 미묘한 차이가 있다고해야합니다. 예 : awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileandawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
kvantour


12

-Fawk그 자체에 대한 논쟁이다 :

$echo "1: " | awk -F":" '/1/ {print $1}'
1

2
콜론을 인용 할 필요가 없습니다.
ceving

6

정규식을 필드 구분 기호로 사용할 수도 있습니다. 다음은 정규식을 사용하여 숫자 "10"을 구분 기호로 설정하여 "bar"를 인쇄합니다.

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'

4

이것을 많이 쓸 필요가 없습니다. awk 명령에 -F 옵션을 사용하여 원하는 필드 구분 기호를 입력하고 인쇄하려는 열 번호를 언급 된 필드 구분 기호에 따라 구분하십시오.

echo "1: " | awk -F: '{print $1}'    
1

echo "1#2" | awk -F# '{print $1}'  
1

4

AWK 텍스트 통역 작동 문서 전체 라인 방식을 진행 하고 그 라인마다 fieldwise 간다 각 라인의 필드에 따라서 $ 1, $ 2 .. $ n은 참조 ($ 1의 첫 번째 필드 인 $ 2 번째 필드 등이며 ...). 명령 줄 아래에서 "-F"스위치를 사용하거나 "FS = ..."가있는 두 개의 괄호 안에 필드 구분 기호를 정의 할 수 있습니다. 이제 "JUERGEN"의 대답을 고려하십시오.

echo "1: " | awk -F  ":" '/1/ {print $1}'

필드 경계 위에서 ":"로 설정되므로 $ 1이라는 두 개의 필드 $ 1과 빈 공간 인 $ 2가 있습니다. 그런 다음 첫 번째 필드 만 출력하도록 필터에 지시하는 정규식 "/ 1 /"이 나타납니다. 통역사가 그러한 표현을 포함하는 줄에 걸려 넘어 질 때 (i 평균 1); "echo"명령의 출력은 "1"을 포함하는 한 줄이므로 필터가 작동합니다.

다음 예제를 다룰 때 :

echo "1: " | awk '/1/ -F ":" {print $1}'

구문이 지저분하고 인터프리터는 부분 F ":"를 무시하기로 선택 하고 빈 필드 인 기본 필드 스플리터로 전환하여 "1 :"을 첫 번째 필드로 출력하고 두 번째 필드는 없습니다!

JUERGEN의 대답에는 좋은 구문이 포함되어 있습니다 ...


2

또는 다음을 사용할 수 있습니다.

echo "1: " | awk  '/1/{print $1-":"}' 

이것은 정말 재미있는 방정식입니다.


1
무슨 /1/뜻입니까?

패턴을 찾으십시오. 이 경우 "1"
José Dias
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.