programing

자르기 명령을 사용하여 공백을 구분 기호로 사용

batch 2023. 4. 26. 23:07
반응형

자르기 명령을 사용하여 공백을 구분 기호로 사용

공백을 .cut지휘권

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

cut -d ' ' -f 2

여기서 2는 원하는 공간 구분 필드의 필드 번호입니다.

일반적으로 공백을 구분 기호로 사용하는 경우 일부 열을 공백으로 정렬하는 명령의 출력을 구문 분석하기 때문에 여러 공백을 하나로 취급하려고 합니다.(그리고 구글 검색이 저를 여기로 안내합니다)

에는 한 의 경싱글우이글.cut명령이 충분하지 않으므로 다음을 사용해야 합니다.

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

또는

awk '{print $2}'

기존의 유용한 답변을 보완하기 위해 QZ 지원부에 별도의 답변을 게시하도록 권장하는 팁을 제공합니다.

여기에는 두 가지 다른 메커니즘이 작용합니다.

  • cut 자체로 구분 기호(이 경우 공백)가 다음으로 전달되어야 합니다.-d별도의 인수가 될 수 있는 옵션 또는 직접 추가할 수 있는지 여부-d.

  • 이 호출 중인 명령에 인수를 전달하기 전에 일반적으로 구문 분석하는 방법입니다.

유틸리티에 대한 POSIX 지침의 인용문으로 답변함(광산 강조)

표준 유틸리티의 SYNOPIS에 필수 옵션 인수 [...]가 있는 옵션이 표시되는 경우, 적합한 응용 프로그램은 해당 옵션과 해당 옵션 인수에 대해 별도의 인수사용해야 합니다.그러나 적합한 구현은 또한 응용 프로그램이 개입 문자 없이 동일한 인수 문자열에 옵션옵션-인수를 지정할 수 있도록 허용해야 합니다.

즉, 다음과 같습니다.경우옵션 인수필수이므로 구분 기호를 다음과 같이 지정할지 여부를 선택할 수 있습니다.

  • 둘 중 하나: 별도의 인수
  • OR: 에 직접 연결입니다.

일단 (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-d고유한 인수로, 따옴표 없이 공백 문자를 포함하는 별도의 인수가 뒤따릅니다.\접두사!

  • :cut-d 공백 문자 추가 - 따옴표 또는 따옴표 없음\접두사! - 동일한 인수의 일부로.

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

  • 셸을 사용하면 리터럴을 그대로 지정할 수 있으며, 이 메커니즘다음과 같은 여러 형식을 취할 수 있습니다.
    • 단일 문자열: 내용'...'문자 그대로 받아들여지고 단일 인수를 형성합니다.
    • 이중 가닥 문자열: 내용물"..."또한 단일 인수를 형성하지만 보간 대상입니다(예: 변수 참조).$var 대체명령대체$(...)또는`...`은 다음과 같이 사용됩니다.$(( ... ))).
    • \-개별 문자 집합: a\단일 문자 앞에 있으면 해당 문자가 리터럴로 해석됩니다.
  • 따옴표는 따옴표 제거를 통해 보완됩니다. 즉, 셸이 명령줄을 구문 분석하면 인수에서 따옴표 문자를 제거합니다.'...'또는"..."또는\instance) - 따라서 호출되는 명령은 따옴표 문자를 보지 않습니다.

다음과 같이 말할 수도 있습니다.

cut -d\  -f 2

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

저는 방금 당신이 또한 사용할 수 있다는 것을 발견했습니다."-d ":

cut "-d "

시험

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

예를 들어 데이터에 공백이 여러 개 있으면 잘라내기가 쉽지 않습니다.저는 더 쉬운 처리를 위해 입력을 정규화하는 것이 유용하다는 것을 알게 되었습니다.한 가지 요령은 아래와 같이 정규화에 사용하는 것입니다.

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

모든 펄 정규식을 브레이킹 토큰으로 사용할 수 있는 컷과 유사한 유틸리티(더 똑똑하지만 더 느림)인 scut.공백 구분은 기본값이지만 다중 문자 또는 대체 정규식 등에서 구분할 수도 있습니다.

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

따라서 위의 명령어는 공백에서 열을 구분하고 (0 기반) 콜 6 2 8 7을 순서대로 추출합니다.

다음과 관련된 답변이 있습니다( 다소 혼란스러운 답변은 인정합니다).sed정규식 및 캡처 그룹:

  • \S*
  • \s*구분 기호
  • (\S*)단어 - captured - 됨캡처됨.
  • .*의 부분

sed 즉, 식캡그이프야해합니다이스케.\(그리고.\).

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

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

당신이 이 대답을 볼 때, 그것은 다소 혼란스럽고, 당신은 생각할 수도 있습니다, 그리고, 왜 귀찮게 하는가?!"로가고 이 의 음, 저몇사아이 "하로들!"로 텍스트 .sed표현.

언급URL : https://stackoverflow.com/questions/816820/use-space-as-a-delimiter-with-cut-command

반응형