awk 프로그램의 경로에서 파일 이름 추출

awk 프로그램의 경로에서 파일 이름 추출

awk 스크립트가 있고 여기에 CSV 파일을 전달했습니다.

awk -f script.awk /home/abc/imp/asgd.csv

내가 하고 있는 일은 .FILENAME 내부의 FILENAME을 가져오는 것입니다 script.awk. 이는 나에게 전체 경로를 제공합니다. awk에 있어서 사용할 수 없습니다 basename FILENAME.

print FILENAME;
/home/abc/imp/asgd.csv

나는 이것을 시도했다script.awk

echo $FILENAME | awk -F"/" '{print $NF}'

하지만 안에서는 그럴 수 없어요 script.awk. asgd.csvawk 프로그램에 어떻게 들어갈 수 있나요 ?

답변1

여러 옵션:

awk '
  function basename(file) {
    sub(".*/", "", file)
    return file
  }
  {print FILENAME, basename(FILENAME)}' /path/to/file

또는:

awk '
  function basename(file, a, n) {
    n = split(file, a, "/")
    return a[n]
  }
  {print FILENAME, basename(FILENAME)}' /path/to/file

이러한 구현은 basename일반적인 경우에는 작동하지만 basename /path/to/x///빈 문자열 대신 빈 문자열 x을 반환하는 등의 특수한 경우에는 작동하지 않지만 일반 파일에서는 이런 일이 발생해서는 안 됩니다.//

파일 경로(마지막 경로까지 /)에 현재 로케일에서 유효한 문자를 형성하지 않는 바이트 시퀀스가 ​​포함된 경우 첫 번째 경로는 올바르게 작동하지 않습니다. 일반적으로 이 문제는 파일 이름이 일부 8로 인코딩된 UTF-8 로케일에서 발생합니다. 중간) 비트 단일 바이트 문자 집합). 모든 바이트 시퀀스가 ​​유효한 문자를 형성하는 C로 로캘을 수정하면 이 문제를 해결할 수 있습니다.

답변2

이 awk one-liner를 사용해 보세요.

$ awk 'END{ var=FILENAME; split (var,a,/\//); print a[5]}' /home/abc/imp/asgd.csv
asgd.csv

답변3

명령이 있는 시스템에서는 함수 나 구조를 사용하여 외부 명령을 호출 basename할 수 있습니다 . 이는 언급된 특수 사례를 설명하는 데 도움이 될 수 있습니다.awksystem()expression | getline varbasename스티븐의 대답.

$ awk '{cmd=sprintf("basename %s",FILENAME);cmd | getline out; print FILENAME,out; exit}' /etc///passwd
/etc///passwd passwd

답변4

입력 CSV에서 또는 입력 파일 경로에서 직접 내보내는 가장 좋은 방법은 이를 되돌린 다음 1개의 열을 가져온 다음 다시 되돌릴 수 있다는 것입니다.

function getFileFromPath() {
    FileName=$1
    cat $FileName | while read Filename
    do
        echo $Filename| rev | awk -v FS='/' '{print $1}' | rev 
    done
}

아니면 단순히

echo $FileNamePath| rev | awk -v FS='/' '{print $1}' | rev 

관련 정보