[bash] 잘라 내기 명령으로 공간을 구분 기호로 사용

cut명령 과 함께 공백을 구분 기호로 사용하고 싶습니다 .

어떤 구문을 사용할 수 있습니까?



답변

cut -d ' ' -f 2

여기서 2는 원하는 공백으로 구분 된 필드의 필드 번호입니다.


답변

일반적으로 공백을 구분 기호로 사용하는 경우 여러 열을 공백으로 정렬하는 명령의 출력을 구문 분석하기 때문에 여러 공백을 하나로 처리하려고합니다. (그리고 그에 대한 Google 검색은 나를 여기로 인도합니다)

이 경우 단일 cut명령으로는 충분하지 않으므로 다음을 사용해야합니다.

tr -s ' ' | cut -d ' ' -f 2

또는

awk '{print $2}'


답변

기존의 유용한 답변을 보완합니다. 별도의 답변을 게시하도록 장려 한 QZ 지원에 대한 팁

여기에는 두 가지 메커니즘 이 사용됩니다.

  • 여부 (가) cut 자체가 에 전달 (이 경우 공간) 구분 기호를 필요 -d옵션은 수하는 별도의 인수 또는 그것을 추가 할 허용 여부 를 직접-d.

  • (b) 쉘이 일반적으로 인수를 호출 한 명령에 전달하기 전에 인수를 구문 분석 하는 방법

(a) 유틸리티에 대한 POSIX 가이드 라인 (강조 광산) 에서 인용 한 답변

표준 유틸리티의 개요가 필수 옵션 인수 […]가 있는 옵션을 표시하면 적합한 응용 프로그램 은 해당 옵션과 옵션 인수에 대해 별도의 인수를 사용해야 합니다 . 그러나 , 순응 구현하여야한다 또한 문자를 간섭하지 않고 동일한 인수 문자열의 옵션 및 옵션 인수를 지정하는 응용 프로그램을 허용 .

즉이 경우, 때문에 -d의 옵션 인수는 필수 , 당신은 할 수 선택 구분 기호를로 지정할지 여부를 :

  • 그것 : 별도의 주장
  • (d) OR :에 직접 첨부 된-d으로 .

(s) 또는 (d)를 선택하면 의 문자열 리터럴 파싱-(b)가 중요합니다.

  • 접근 방식 (들) , 다음과 같은 형식 모두 동일합니다

    • -d ' '
    • -d " "
    • -d \<space> # <space> used to represent an actual space for technical reasons
  • 접근법 (d) 를 사용하면 다음과 같은 형식이 모두 같습니다.

    • -d' '
    • -d" "
    • "-d "
    • '-d '
    • d\<space>

동등성은 의 문자열 리터럴 처리에 의해 설명됩니다 .

위의cut 모든 솔루션 은 시간 에 따라 정확히 동일한 문자열 (각 그룹에서)을 나타 냅니다 .

  • (들) : cut보고 -d그것으로, 자신의 a로 다음 인수, 별도의 공간 문자가 들어 인수 – 따옴표 또는없이 \접두사를!

  • (D) : cut-d 을 더한 따옴표 또는없이 – 공백 문자 \접두사! – 같은 주장의 일부로 .

쉘이 문자열 리터럴을 구문 분석 하는 방법 에 따라 각 그룹의 양식이 궁극적으로 동일한 이유는 두 가지입니다 .

  • 쉘은 지정 될 문자 수 와 같이 통하여 라는 메커니즘을 인용 걸릴 수 있습니다, 여러 가지 형태를 :
    • 작은 따옴표로 묶인 문자열 : 내부의 내용 '...'문자 그대로 받아 단일 인수를 형성합니다.
    • 큰 따옴표로 묶인 문자열 : 내부의 내용 "..."단일 인수를 구성하지만 보간에 영향을받습니다 ( $var, 명령 대체 ( $(...)또는 `...`) 또는 산술 확장 ( $(( ... ))) 과 같은 변수 참조 확장 ).
    • \개별 문자 인용 : \단일 문자 앞의 문자는 해당 문자를 리터럴로 해석합니다.
  • 인용에 의해 보완 인용 제거 , 쉘 명령 줄을 구문 분석되면, 그 수단 제거 인수에서 인용 부호를 (둘러싸 '...'거나 "..."또는 \인스턴스) – 따라서, 명령 존재는 결코이 인용 문자를 볼 수 없습니다 호출 .

답변

당신은 또한 말할 수 있습니다 :

cut -d\  -f 2

백 슬래시 다음에 두 개의 공백이 있습니다.


답변

나는 다만 발견 당신은 또한 사용할 수 "-d ":

cut "-d "

테스트

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am


답변

예를 들어 데이터에 여러 공간이 있으면 잘라내기로 쉽게 할 수 없습니다. 더 쉬운 처리를 위해 입력을 정규화하는 것이 유용하다는 것을 알았습니다. 한 가지 트릭은 아래와 같이 정규화에 sed를 사용하는 것입니다.

echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2  #bar


답변

scut , 어떤 perl 정규식을 속보 토큰으로 사용할 수있는 잘린 유틸리티 (더 똑똑하지만 느리게 만든) 공백을 나누는 것이 기본값이지만 다중 문자 정규 표현식, 대체 정규 표현식 등을 사용할 수도 있습니다.

scut -f='6 2 8 7' < input.file  > output.file

따라서 위의 명령은 공백의 열을 나누고 (0 기반) col 6 2 8 7을 순서대로 추출합니다.