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


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.