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


328

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

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


42
사실이 아닙니다. cut의 맨 페이지는 이것을 설명하지 않으며 일반적으로
— 유익

2
또한 "info cut"은이 경우 개선되지 않습니다.
— 카디프 우주 남자

3
@ mklement0 내가 기억한다면, 나는 삭제 된 의견에 답하고 있었는데, 그 이유는 그 이유가 무엇이든간에 맨 페이지에서 대답 된 것으로이 질문을 무시하고 있습니다. 그렇지 않다-지금, 나는이 정보의 부족에 대한 정당한 이유가있을 수 있음을 인정하면서도, 일반적인 사용 예제가없는 문서는 종종 쓸모없는 것이 아닐 때 적어도 자극적이라고 생각합니다.
— UncleZeiv

3
@UncleZeiv 설명해 주셔서 감사합니다. 이 질문에 관심이 있다면 man페이지가 충분하지 않다고 가정하는 것이 좋습니다. " 탭 문자 대신 필드 구분 문자로 -d delim사용하십시오 delim." (BSD cut이지만 GNU 버전과 POSIX 사양은 거의 동일합니다). 사용 쉘은 호출 할 cut- 일반적인 경우를 - 따라서하는 방법을 알고 당신을 필요로 일반적으로 사용 인수로 공간을 통과 쉘 구문 틀림없는, cutman 페이지의 작업을. 그러나 실제 예제는 항상 도움이되며 GNU 매뉴얼 페이지에는 부족합니다.
— mklement0

4
선택한 답변 은 기술적으로는 정확 하지만 @ mklement0에 의해 가장 최근의 포괄적 인 답변 을 정식 답변으로 선택하여 맨 위에 필터링하십시오.
— David LeBauer

답변:


367
cut -d ' ' -f 2

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


2
RegEx에서와 같이 컷을 구분 문자로 사용하도록 컷에 지시 할 수 있습니까? 공간 즉 임의의 수, 예 \ S +
— amphibient

3
@foampile 아니오, 당신이 할 수 있다고 생각하지 않습니다.
— Jonathan Hartley

6
에 정규 표현식을 사용할 수는 없지만 github.com/arielf/cutscutcutscut
— arielf

세 번째 공간 제한 필드를 모두 얻을 수 있습니까? 좋아하는 cut -d ' ' -f 3,6,9,12,15,18모든 번호를 지정하지 않고?
— Monocito

169

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

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

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

또는

awk '{print $2}'

2
awk 예제 사용법, 내가 필요로하는 것에 감사드립니다.
— spazm

44

기존의 유용한 답변을 보완합니다. 별도의 답변을 게시하도록 장려 한 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, 명령 대체 ( $(...)또는 `...`) 또는 산술 확장 ( $(( ... ))) 과 같은 변수 참조 확장 ).
    • \- 개별 문자 인용 : \단일 문자 앞의 문자는 해당 문자를 리터럴로 해석합니다.
  • 인용에 의해 보완 인용 제거 , 쉘 명령 줄을 구문 분석되면, 그 수단 제거 인수에서 인용 부호를 (둘러싸 '...'거나 "..."또는 \인스턴스) - 따라서, 명령 존재는 결코이 인용 문자를 볼 수 없습니다 호출 .

36

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

cut -d\  -f 2

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


30
'\'가 다음 캐릭터를 이스케이프한다는 것을 알고있는 사람은 다음에 무엇이 올지주의해서 다룰 것입니다. '\'를 사용하여 이와 같은 공백 문자를 이스케이프 처리하는 것은 매우 일반적인 관용구입니다.
— Jonathan Hartley

3
@ 조나단 하틀리는 일반적으로 코드의 대부분은 : 참으로 읽을 수
— 루카 Borrione

1
리눅스 / 유닉스 관점에서, \ 나의 첫 시도였으며 효과가 있었다. 나는에 비해 덜 분명하다는 데 동의 ' '하지만, 많은 사람들이 그것을 행동의 확신으로 여기에서 읽게되어 기쁩니다. 더 나은 이해를 위해 아래 @ mklement0의 의견을 참조하십시오.
— tresf

@JonathanHartley 보정 : " '\'를 알고 있는 이기적인 사람은 다음 문자를 피하고 다른 사람들도이를 알고 있다고 가정합니다 ." 개인 프로젝트의 경우에는 적용되지 않지만 팀 환경에서는 가정이 매우 위험하고 잠재적으로 비용이 많이 드는 것입니다.
— Eduard Nicodei

1
@EduardNicodei 오 동의합니다. 우리는 저자가 아니라 코드 독자 ( "누가 알겠는가 ...?")에 대해 이야기하고있었습니다. 그러나 일부 팀에서는 특정 수준의 숙련도를 취하는 것이 좋습니다. 환경에 따라 다릅니다.
— Jonathan Hartley

5

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

cut "-d "

테스트

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

1
실제로-또는 '-d '.
— mklement0

3
하는 것으로 부터 cut의 '관점 모두 다음 중은 동일하다 : "-d ", '-d ', -d" ", -d' ',과 -d\<space>: 옵션 (직접 APPEND 모든 형태의 옵션 인수 (공간) -d에서) 및 그 결과 동일한 문자열 시간으로는 cut그들을보고 : 하나의 쉘 이 따옴표 제거
— mklement0

1
@ mklement0의 대답은해야 대답. 이 페이지에서 가장 포괄적입니다 (설명이지만).
— tresf

@QZSupport : 정서와 격려에 감사드립니다. 추가 배경 정보가 포함 된 답변을 게시 할 수있었습니다.
— mklement0

1
롤 매혹 발견!
— Harry

4

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

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

3

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

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

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


0

sed, 정규 표현식 및 캡처 그룹과 관련된 답변 (약간 혼란스러운 답변을 인정합니다)이 있습니다.

  • \S* - 첫번째 단어
  • \s* -구분자
  • (\S*) -두 번째 단어-캡처
  • .* -나머지 줄

A와 sed표현, 캡처 그룹의 요구 탈출, 즉 수 \(와 \).

이 \1캡처 된 그룹의 사본, 즉 두 번째 단어를 반환합니다.

$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta

이 답변을 보면 다소 혼란스럽고 왜 귀찮게 생각할까요? 글쎄, 나는 "아하!" 이 패턴을 사용하여 단일 sed표현식으로 복잡한 텍스트 추출 문제를 해결 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.