[bash] ‘cut’명령어를 동일한 순차적 구분 기호로 처리하는 방법은 무엇입니까?
열 기반의 ‘공간’조정 텍스트 스트림에서 특정 (네 번째) 필드를 추출하려고합니다. cut
다음과 같은 방법으로 명령 을 사용하려고합니다 .
cat text.txt | cut -d " " -f 4
불행히도 cut
여러 공백을 하나의 구분 기호로 취급하지 않습니다. 나는 awk를 통해 파이프 수
awk '{ printf $4; }'
또는 sed
sed -E "s/[[:space:]]+/ /g"
공백을 접을 수 있지만 cut
기본적으로 여러 구분 기호 를 처리 할 수있는 방법이 있는지 알고 싶습니다 .
답변
시험:
tr -s ' ' <text.txt | cut -d ' ' -f4
로부터 tr
매뉴얼 페이지
-s, --squeeze-repeats는 반복되는 문자의 각 입력 순서를 대체합니다. 한 번의 발생으로 SET1에 나열됩니다. 그 캐릭터의
답변
당신이 당신의 질문에 의견을 말할 때, awk
정말 갈 길입니다. kev의 답변에서 볼 수 있듯이 공간을 짜는 것과 cut
함께 사용할 수 있습니다 .tr -s
그러나 앞으로 독자들을 위해 가능한 모든 조합을 살펴 보겠습니다. 설명은 테스트 섹션에 있습니다.
tr | 절단
tr -s ' ' < file | cut -d' ' -f4
어 wk
awk '{print $4}' file
세게 때리다
while read -r _ _ _ myfield _
do
echo "forth field: $myfield"
done < file
sed
sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file
테스트
이 파일이 주어지면 명령을 테스트 해 봅시다.
$ cat a
this is line 1 more text
this is line 2 more text
this is line 3 more text
this is line 4 more text
tr | 절단
$ cut -d' ' -f4 a
is
# it does not show what we want!
$ tr -s ' ' < a | cut -d' ' -f4
1
2 # this makes it!
3
4
$
어 wk
$ awk '{print $4}' a
1
2
3
4
세게 때리다
필드를 순차적으로 읽습니다. _
우리는 이것을 사용하여 이러한 필드를 무시하기위한 “정크 변수”로서의 이탈 변수임을 나타냅니다. 이런 식으로, 우리 $myfield
는 파일 사이의 공간에 관계없이 파일의 4 번째 필드로 저장 합니다.
$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4
sed
공백이없는 세 그룹의 공백을 잡습니다 ([^ ]*[ ]*){3}
. 그런 다음, 네 번째 필드로서 공백이 될 때까지 오는 모든 것을 포착하여 최종적으로로 인쇄됩니다 \1
.
$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4
답변
가장 짧고 친근한 솔루션
의 너무 많은 제한에 좌절 한 후 cut
, 나는 cuts
“스테로이드 컷 (cut on steroids)”을 요구하는 내 자신의 대체물을 썼습니다 .
절단 은이문제와 기타 여러 가지 절단 / 붙여 넣기 문제에대한 가장 미니멀리스트 솔루션을 제공합니다.
이 특정 질문을 다루는 많은 예 중 하나가 있습니다.
$ cat text.txt
0 1 2 3
0 1 2 3 4
$ cuts 2 text.txt
2
2
cuts
지원합니다 :
- 파일에서 가장 일반적인 필드 구분 기호 자동 감지 (+ 기본값을 무시하는 기능)
- 다중 문자, 혼합 문자 및 정규식 일치 구분 기호
- 구분 기호가 혼합 된 여러 파일에서 열 추출
- 줄의 시작과 더불어 줄의 끝에서 (음수를 사용하여) 오프셋
- 열의 자동 병렬 붙여 넣기 (
paste
별도의 호출 필요 없음 ) - 필드 재정렬 지원
- 사용자가 개인 환경 설정을 변경할 수있는 구성 파일
- 사용자 친 화성 및 미니멀리스트 필수 타이핑에 중점을 둡니다.
그리고 훨씬 더. 어느 것도 표준에 의해 제공되지 않습니다 cut
.
참조 : https : //.com/a/24543231/1296044
소스 및 설명서 (무료 소프트웨어) : http://arielf.github.io/cuts/
답변
이 Perl one-liner는 Perl이 awk와 얼마나 밀접한 관련이 있는지 보여줍니다.
perl -lane 'print $F[3]' text.txt
그러나 자동 @F
분할 배열은 인덱스에서 시작 $F[0]
하는 반면 awk 필드는$1
답변
cut
내가 아는 버전으로 는 불가능합니다. cut
는 구분 기호가 공백이 아니고 /etc/passwd
필드 수가 고정 된 파일을 구문 분석하는 데 주로 유용 합니다. 행의 두 구분 기호는 빈 필드를 의미하며 공백에도 적용됩니다.