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.csv
awk 프로그램에 어떻게 들어갈 수 있나요 ?
답변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
할 수 있습니다 . 이는 언급된 특수 사례를 설명하는 데 도움이 될 수 있습니다.awk
system()
expression | getline var
basename
스티븐의 대답.
$ 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