텍스트 라인에서 끝까지 세어 필드를 자르는 방법은 무엇입니까?


32

cut 명령을 사용하여 줄에서 필드를 선택하는 방법을 알고 있습니다. 예를 들어 다음과 같은 데이터가 제공됩니다.

a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

이 명령은

cut -d, -f2 # returns the second field of the input line

보고:

b
g
l

내 질문 : 끝에서 번째 필드 계산 을 어떻게 선택할 수 있습니까? 이전 예제에서 결과는 다음과 같습니다.

d
i
n

NN

답변:


52

다음 cut과 같이 입력 전후에 입력을 되돌립니다 rev.

<infile rev | cut -d, -f2 | rev

산출:

d
i
n

1
bin 폴더에 작은 스 니펫이 많이 있습니다. rcut은 정확히 다음과 같습니다 : #! / bin / bash rev | "$ @"컷 | rev
John Allsup

2
너무 나쁜 cut것은 파이썬과 같은 부정적인 필드 인덱스를 취할 수 없습니다.
Keith Devens

10

이것을 시도하십시오 :

awk -F, '{print $(NF-1)}' file.txt

또는 사용 :

perl -F, -lane 'print $F[-2]' file.txt

또는 사용 (manatwork 덕분에) :

ruby -F, -lane 'print $F[-2]' file.txt

또는 bash(manatwork 덕분에) :

while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt

또는 사용 :

cat file.txt |
python -c $'import sys\nfor line in sys.stdin:\tprint(line.split(",")[-2])'

1
bash이를 위해 고정 열 개수가 필요하지 않습니다 while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt.
manatwork

1
변경할 경우 BTW, 세 번째 솔루션은 작동 perl으로 ruby.
manatwork 2013

고마워, ruby추가, bash편집.
Gilles Quenot

1
네 번째 필드가 -환경으로 시작 하거나 (환경, 쉘 또는 쉘이 컴파일 된 방법에 따라) 백 슬래시 문자를 포함 할 수 echo있으면 옵션이 아닙니다. 할 이유는 사기꾼 필요 catenate file.txt으로 아무것도 에 공급하기 전에 python!?. 당신이 필요로 read -A하는 대신 read -aksh93하고 zsh. 음의 아래 첨자 zsh는 최신 버전의 ksh93및 에서만 작동 bash합니다. 이전 버전에서는 다음을 사용할 수 있습니다${d: -2:1}
Stéphane Chazelas

2
@StephaneChazelas, 나는 ${d[@]: -2:1}당신이 마지막 문장에서 의미 하는 것 같아요 .
manatwork

0

sed 사용하기 :

sed -E 's/^([^,]*,)*([^,]*)(,[^,]*){1}$/\2/' infile

산출:

d
i
n

설명

  • ([^,]*,)* 쉼표가 아닌 임의의 수의 쉼표 문자 뒤에 쉼표 (예 : 임의의 수의 열)가옵니다.
  • ([^,]*) 열과 일치합니다.
  • (,[^,]*){1}수량 {1}자를 변경 {2}하면 끝의 두 번째 열과 일치하는 경우 끝에 하나의 열과 일치합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.