수색…


소개

cut 명령은 텍스트 파일의 줄 부분을 빠르게 추출하는 방법입니다. 그것은 가장 오래된 유닉스 명령에 속한다. 가장 많이 사용되는 구현은 Linux에서 발견 된 GNU 버전과 MacOS에서 발견 된 FreeBSD 버전이지만 Unix의 각 특징은 고유합니다. 차이점은 아래를 참조하십시오. 입력 라인은 stdin 또는 명령 행에서 인수로 나열된 파일에서 읽습니다.

통사론

  • 잘라 내기 -f1,3 # 첫 번째 세 번째 탭 구분 필드 추출 (stdin에서)

  • 세번째 필드까지 처음부터 -f1-3 # 추출물 컷 (말단 포함)

  • cut -f-3 # -3은 1-3으로 해석됩니다.

  • cut -f2- # 2-는 두 번째에서 마지막으로 해석됩니다.

  • cut -c1-5,10 # stdin의 위치에서 1,2,3,4,5,10의 문자 를 추출합니다.

  • cut -s -f1 # 구분 기호를 포함하지 않는 행을 억제합니다.

  • cut --complement -f3 # (GNU cut only) 세번째 칸을 제외한 모든 칸을 추출 한다.

매개 변수

매개 변수 세부
-f, --fields 필드 기반 선택
-d, --delimiter 필드 기반 선택을위한 구분 기호
-c, --characters 문자 기반 선택, 구분 기호 무시 또는 오류
-s, - 단 - 구분 구분 기호 문자가없는 줄을 표시하지 않습니다 (그렇지 않으면 인쇄됩니다).
--보어 반전 된 선택 (지정된 필드 / 문자를 제외하고 모두 추출
- 출력 구분 기호 입력 구분 기호와 다른 경우를 지정하십시오.

비고

1. 구문의 차이점

위 표의 긴 옵션은 GNU 버전에서만 지원됩니다.

2. 어떤 캐릭터도 특별한 대우를받지 못한다.

FreeBSD cut (예를 들어 MacOS와 함께 --complement )에는 --complement 스위치가 없으며 문자 범위의 경우 colrm 명령을 대신 사용할 수 있습니다.

  $ cut --complement -c3-5 <<<"123456789"
  126789

  $ colrm 3 5 <<<"123456789"
  126789

그러나 colrm 은 TAB 문자 (ASCII 9)를 8의 다음 배수까지 실제 표로 취급하고 백 스페이스 (ASCII 8)를 -1 폭으로 취급하기 때문에 큰 차이가 있습니다. 반대로 cut 은 모든 문자를 하나의 열로 취급합니다.

  $ colrm  3 8 <<<$'12\tABCDEF' # Input string has an embedded TAB
  12ABCDEF

  $ cut --complement -c3-8 <<<$'12\tABCDEF'
  12F

3. (아직도 아니요) 국제화

cut 을 디자인 할 때 모든 문자는 1 바이트 길이 였고 국제화는 문제가되지 않았습니다. 보다 넓은 문자를 사용하는 시스템이 인기를 얻었을 때, POSIX가 채택한 해결책은 몇 바이트의 크기가 있더라도 문자 를 선택한다는 의미를 유지해야하는 이전의 -c 스위치를 사용하지 않고 새로운 스위치 -b 를 도입하는 것이 었습니다. 현재의 문자 인코딩 관계없이 바이트를 선택하십시오. 대부분의 대중적인 구현에서 -b 가 소개되고 작동하지만 -c-b 와 똑같이 작동하고 있어야합니다. 예를 들어 GNU cut :

SE의 스팸 필터는 격리 된 간지 문자로 영어 텍스트를 블랙리스트에 표시합니다. 나는이 한계를 극복하지 못했기 때문에 다음 예제는 표현할 수있는 것보다 덜 표현적이다.

  # In an encoding where each character in the input string is three bytes wide,
  # Selecting bytes 1-6 yields the first two characters (correct)
  $ LC_ALL=ja_JP.UTF-8 cut -b1-6 kanji.utf-8.txt
  ...first two characters of each line...
  

  # Selecting all three characters with the -c switch doesn’t work.
  # It behaves like -b, contrary to documentation.
  $ LC_ALL=ja_JP.UTF-8 cut -c1-3 kanji.utf-8.txt
  ...first character of each line...

  # In this case, an illegal UTF-8 string is produced.
  # The -n switch would prevent this, if implemented.
  $ LC_ALL=ja_JP.UTF-8 cut -n -c2 kanji.utf-8.txt
  ...second byte, which is an illegal UTF-8 sequence...

문자가 ASCII 범위를 벗어나서 cut 을 사용하려면 인코딩에서 문자 너비를 항상 알고 있어야하고 그에 따라 -b 사용해야합니다. 문서화 된대로 -c 가 작동하기 시작하면, 스크립트를 변경할 필요가 없습니다.

4. 속도 비교

cut 의 한계는 사람들로 하여금 그 유용성을 의심하게 만든다. 사실, 더 강력하고 대중적인 유틸리티로 동일한 기능을 구현할 수 있습니다. 그러나 cut 의 장점은 성능 입니다. 몇 가지 속도 비교는 아래를 참조하십시오. test.txt 에는 3 개의 백만 줄이 있고 5 개의 공백으로 구분 된 입력란이 있습니다. awk 테스트의 경우 mawk 가 GNU awk 보다 빠르기 때문에 사용되었습니다. 셸 자체 (마지막 줄)는 훨씬 최악의 수행자입니다. 주어진 시간 (초)은 time 명령이 실시간으로 제공하는 시간 입니다.

(단지 오해를 피하기 위해 : 모든 테스트 된 명령은 주어진 입력으로 동일한 출력을 주었지만, 물론 필드가 동등하지 않고 여러 상황에서 다른 출력을 제공 할 수 있습니다. 특히 필드가 가변 수의 공백으로 구분 된 경우)

명령 시각
cut -d ' ' -f1,2 test.txt 1.138 초
awk '{print $1 $2}' test.txt 1.688 초
join -a1 -o1.1,1.2 test.txt /dev/null 1.767 초
perl -lane 'print "@F[1,2]"' test.txt 11.390 초
grep -o '^\([^ ]*\) \([^ ]*\)' test.txt 22.925 초
sed -e 's/^\([^ ]*\) \([^ ]*\).*$/\1 \2/' test.txt 52.122 초
while read ab _; do echo $a $b; done <test.txt 55.582 초

5. 참조 매뉴얼 페이지

기본 사용법

일반적인 사용법은 CSV 유형 파일로, 각 행은 -d 옵션으로 지정된 분리 문자로 구분 된 필드로 구성됩니다. 기본 구분 기호는 Tab 문자입니다. data.txt 와 같은 라인이있는 데이터 파일이 있다고 가정 해 보겠습니다.

0 0 755 1482941948.8024
102 33 4755 1240562224.3205
1003 1 644 1219943831.2367

그때

# extract the third space-delimited field
$ cut -d ' ' -f3 data.txt
755
4755
644

# extract the second dot-delimited field
$ cut -d. -f2 data.txt    
8024
3205
2367

# extract the character range from the 20th through the 25th character
$ cut -c20-25 data.txt 
948.80
056222    
943831

보통 스위치와 매개 변수 사이에는 선택적 공백이있을 수 있습니다. -d,-d , 와 같으며 -d ,

GNU cut--output-delimiter 옵션을 지정할 수 있습니다 : (이 예제의 독립된 특징은 쉘에 의한 특수 처리를 피하기 위해 입력 분리 문자로서 세미콜론을 이스케이프 처리해야한다는 것입니다)

$ cut --output-delimiter=, -d\; -f1,2 <<<"a;b;c;d"
a,b

하나의 구분 문자 만

하나 이상의 구분자를 사용할 수 없습니다 : -d ",;:" 와 같은 것을 지정하면, 일부 구현은 첫 번째 문자 만 구분 기호 (이 경우 쉼표)로 사용합니다. 다른 구현 (예 : GNU cut )은 너에게 오류 메시지가있다.

$ cut -d ",;:" -f2 <<<"J.Smith,1 Main Road,cell:1234567890;land:4081234567"
cut: the delimiter must be a single character
Try `cut --help' for more information.

반복 된 구분 기호는 빈 필드로 해석됩니다.

$ cut -d, -f1,3 <<<"a,,b,c,d,e"
a,b

다소 명확하지만, 공백으로 구분 된 문자열을 사용하면

$ cut -d ' ' -f1,3 <<<"a  b c d e"
a b

cut 은 쉘이나 다른 프로그램처럼 인수를 구문 분석하는 데 사용할 수 없습니다.

따옴표 없음

구분 기호를 보호 할 방법이 없습니다. 스프레드 시트 및 유사한 CSV 처리 소프트웨어는 대개 구분 기호가 포함 된 문자열을 정의 할 수있는 텍스트 인용 문자를 인식 할 수 있습니다. cut 안된다.

$ cut -d, -f3 <<<'John,Smith,"1, Main Street"'
"1

추출, 조작하지 않음

필드의 순서를 바꾸거나 반복하지 않고 선의 일부만 추출 할 수 있습니다.

$ cut -d, -f2,1 <<<'John,Smith,USA' ## Just like -f1,2
John,Smith
$ cut -d, -f2,2 <<<'John,Smith,USA' ## Just like -f2
Smith


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow