130

awkファイルへの絶対パスを指定してファイルの名前を取得するために使用しようとしています。
たとえば、/home/parent/child/filename取得したい入力パスが与えられた場合、次のfilename ことを試しました。

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

これは完全に機能します。ただし、入力が次の構造の場合は正しくない
ハード コーディングです。$5

/home/parent/child1/child2/filename

したがって、一般的な解決策では、常に最後のフィールド (ファイル名になります) を取得する必要があります。

awk substr 関数でこれを行う簡単な方法はありますか?

4

8 に答える 8

7

Perl ソリューションを受け入れる場合は、ここに fedorqui の awk ソリューションに似たソリューションがあります。

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

-F//フィールド区切り文字が自動分割配列
$F[-1]の最後の要素であることを指定します@F

于 2015-09-10T20:24:55.467 に答える
3

私はこれで3年遅れていることを知っていますが....パラメーターの拡張を検討する必要があります。これは組み込みで高速です。

入力が var にある場合、たとえば $var1 とします${var1##*/}。下を見てください

$ 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
于 2017-05-10T03:38:21.500 に答える
3

ベース名の回答へのコメントである必要がありますが、十分なポイントがありません。

二重引用符を使用しない場合、basenameスペース文字があるパスでは機能しません:

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

引用符付きでOK " "

$ 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
于 2016-07-22T08:50:22.207 に答える