从awk程序中的路径中提取文件名


21

我有一个awk脚本,并且已将CSV文件传递给它。

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

我正在做的是在中获取FILENAME script.awk。FILENAME给了我完整的路径。由于我处于awk状态,因此无法使用basename FILENAME

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

我已经尝试过了 script.awk

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

但我无法在中执行此操作script.awk。我如何进入asgd.csvawk程序?

Answers:


33

几种选择:

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/返回空字符串而不是/,尽管对于常规文件而言,这不应发生。

如果文件路径(直到最后一个/)包含在当前语言环境中不构成有效字符的字节序列,则第一个将无法正常工作(通常这种情况发生在UTF-8语言环境中,文件名编码为8位单字节字符集)。您可以通过将语言环境固定为C来解决此问题,其中每个字节序列均构成有效字符。


5
如果您需要可以在现有awk脚本中轻松运行而无需引入功能的代码,则应使用:n = split(FILENAME, a, "/"); basename=a[n];。请勿使用,sub因为它实际上会更改FILENAME变量(由于awk使用按值调用,因此该变量不是函数的问题)。
shiri


0

从输入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 

0

使用Awk的分割功能

一种方法是使用split函数。例如:

awk '{idx = split(FILENAME, parts, "/"); print parts[idx]; nextfile}' /path/to/file

这甚至适用于多个文件。例如:

$ awk '{idx = split(FILENAME, parts, "/"); print parts[idx]; nextfile}' \
      /etc/passwd /etc/group
passwd
group

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.