【问题标题】:How to parse a unix directory by awk如何通过 awk 解析 unix 目录
【发布时间】:2023-03-06 07:26:02
【问题描述】:

我需要你的帮助来通过 awk 解析目录信息。 通过下面的输入,我可以获得每行的完整目录名和文件名吗? 即目录结构不同,目录数量没有规定。

输入(文件路径列表)

/dir1/filename
/dir1/dir2/filename
/dir1/dir2/dir3/filename
/dir5/dir2/dir4/filename

输出(目录名和文件名之间可以有任何空格)

/dir1/         filename
/dir1/dir2/           filename
/dir1/dir2/dir3/                   filename
/dir5/dir2/dir4/          filename

【问题讨论】:

  • 这是作业吗?你试过什么?
  • “输入”是一个包含文件路径列表的文件,还是您只是向我们展示您的目录结构?如果是前者,那么你可以使用 awk,如果是后者,那么它是 shell 的工作,而不是 awk,你应该使用 find + basename 或类似的。
  • 你一定需要使用awk吗?对于dirnamebasename 来说,这看起来是个完美的工作。否则,“文件名”(它可能是一个目录,除非你真的做了一个统计,否则你无法知道,这不是真正的 awk 事情)是最后一个“/”之后的东西(比如match("$0, (/[^/]+)/([^/]+)$", a然后从 a) 中选择开始/长度。
  • 我应该用目录名和文件名拆分它,然后将它放入数据库中。之后,我将使用该信息来连接其他表。我需要使用awk。你能告诉我如何使用 Awk 来实现吗?谢谢。

标签: awk


【解决方案1】:

听起来这可能是您正在寻找的:

$ awk '{sub("[^/]+$","\t&")}1' file
/dir1/  filename
/dir1/dir2/     filename
/dir1/dir2/dir3/        filename
/dir5/dir2/dir4/        filename

但任何解决方案都会遇到文件和/或目录名称的问题,其中包含用于导入您提到的数据库的分隔符。

【讨论】:

    【解决方案2】:

    还有更简洁的答案,但这里有一个基于 match 在 Ed 的 cmets 的帮助下:

    { 
      dname = substr($0, match($0, ".*/"), RLENGTH); 
      fname = substr($0, RLENGTH+1); 
      printf("%s %s\n", dname, fname); 
    }
    

    输入

    /dir1/filename
    /dir1/dir2/filename
    /dir1/dir2/dir3/filename
    /dir5/dir2/dir4/filename
    ../dir3/file
    

    输出

    /dir1/ filename
    /dir1/dir2/ filename
    /dir1/dir2/dir3/ filename
    /dir5/dir2/dir4/ filename
    ../dir3/ file
    

    【讨论】:

    • 我认为长度(行)应该是“长度($ 0)”。那是对的吗?有了它,它运作良好,这就是我真正想要得到的。简单的。谢谢。
    • 哎呀-是的,@Sigularity;固定。
    • 啊。我学到了。有用。实际上,我不介意任何 。我只是可以获得目录名称和文件名而无需任何缩进。这就对了。谢谢。
    【解决方案3】:

    gawk:

    awk '{print gensub("(.*)/(.*)","\\1 \\2","g")}' File
    

    【讨论】:

      猜你喜欢
      • 2015-05-08
      • 2010-11-16
      • 1970-01-01
      • 2016-03-05
      • 2015-06-04
      • 1970-01-01
      • 2011-04-07
      • 2014-05-09
      • 2012-06-25
      相关资源
      最近更新 更多