Program Tip

awk substr을 사용하여 마지막 필드 가져 오기

programtip 2020. 10. 6. 19:00
반응형

awk substr을 사용하여 마지막 필드 가져 오기


다음과 같은 간단한 요구 사항이 있습니다
. 절대 디렉토리로 파일 이름을 얻습니다.
예를 들어 /home/parent/child/filename
내 요구 사항은 여기에서 파일 이름을 잘라내는 것입니다.
내가 시도한 것은 :

awk -F "/" '{print $5}' input

완벽하게 작동합니다.
그러나 여기에 $5내 입력이 다음과 같은 구조를 갖는 경우 다를 수있는 하드 코딩 이 있습니다.

/home/parent/child1/child2/filename

따라서 하드 코딩없이 동적이어야합니다. 논리는 다음과 같습니다.
항상 파일 이름이 될 마지막 필드를 가져옵니다 (따라서 반대로 확인해야 함).

누구든지 awk substr 함수 나 다른 함수로 나를 도울 수 있습니까?


awk정의 할 수있는 필드 구분 기호를 기반으로 필드의 행 분할 하는 사실을 사용하십시오 . 따라서 필드 구분 기호를 정의하면 /다음과 같이 말할 수 있습니다.

awk -F "/" '{print $NF}' input

NF현재 레코드의 필드 수 나타내는 것처럼 $NF인쇄는 마지막 레코드를 인쇄 하는 것을 의미합니다.

따라서 다음과 같은 파일이 주어집니다.

/home/parent/child1/child2/child3/filename
/home/parent/child1/child2/filename
/home/parent/child1/filename

다음과 같이 출력됩니다.

$ awk -F"/" '{print $NF}' file
filename
filename
filename

이 경우 다음 basename대신 사용하는 것이 좋습니다 awk.

 $ basename /home/parent/child1/child2/filename
 filename

또 다른 옵션은 bash 매개 변수 대체 를 사용하는 것 입니다.

$ foo="/home/parent/child/filename"
$ echo ${foo##*/}
filename
$ foo="/home/parent/child/child2/filename"
$ echo ${foo##*/}
filename

Perl 솔루션에 열려있는 경우 여기에 fedorqui의 awk 솔루션과 유사한 솔루션이 있습니다.

perl -F/ -lane 'print $F[-1]' input

-F/지정 /필드 분리 그대로
$F[-1]마지막 요소 @F자동 구분 어레이


basename 답변에 대한 주석이어야하지만 요점이 충분하지 않습니다.

큰 따옴표를 사용하지 않으면 basename공백 문자가있는 경로에서 작동하지 않습니다.

$ basename /home/foo/bar foo/bar.png
bar

좋아 따옴표 ""

$ basename "/home/foo/bar foo/bar.png"
bar.png

파일 예

$ cat a
/home/parent/child 1/child 2/child 3/filename1
/home/parent/child 1/child2/filename2
/home/parent/child1/filename3

$ while read b ; do basename "$b" ; done < a
filename1
filename2
filename3

I know I'm like 3 years late on this but.... you should consider parameter expansion, it's built-in and faster.

if your input is in a var, let's say, $var1, just do ${var1##*/}. Look below

$ var1='/home/parent/child1/filename'
$ echo ${var1##*/}
filename
$ var1='/home/parent/child1/child2/filename'
$ echo ${var1##*/}
filename
$ var1='/home/parent/child1/child2/child3/filename'
$ echo ${var1##*/}
filename

Like 5 years late, I know, thanks for all the proposals, I used to do this the following way:

$ echo /home/parent/child1/child2/filename | rev | cut -d '/' -f1 | rev
filename

Glad to notice there are better manners


You can also use:

    sed -n 's/.*\/\([^\/]\{1,\}\)$/\1/p'

or

    sed -n 's/.*\/\([^\/]*\)$/\1/p'

참고URL : https://stackoverflow.com/questions/17921544/get-last-field-using-awk-substr

반응형