如何用awk解析unix目录

如何用awk解析unix目录,awk,Awk,我需要你的帮助来解析awk的目录信息。 通过下面的输入,我可以得到每行的完整目录名和文件名吗? 也就是说,目录结构各不相同,并且没有关于目录数量的规则 输入(文件路径列表) 输出(目录名和文件名之间的任何空格都可以) 这里有更简洁的答案,但这里有一个基于match的答案,并得到了Ed评论的帮助: { dname = substr($0, match($0, ".*/"), RLENGTH); fname = substr($0, RLENGTH+1); printf("%s %

我需要你的帮助来解析awk的目录信息。 通过下面的输入,我可以得到每行的完整目录名和文件名吗? 也就是说,目录结构各不相同,并且没有关于目录数量的规则

输入(文件路径列表) 输出(目录名和文件名之间的任何空格都可以)
这里有更简洁的答案,但这里有一个基于
match
的答案,并得到了Ed评论的帮助:

{ 
  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
输出

/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

这里有更简洁的答案,但这里有一个基于
match
的答案,并得到了Ed评论的帮助:

{ 
  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
输出

/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
gawk

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

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

听起来这可能就是你想要的:

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

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

听起来这可能就是您要查找的内容:

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

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

这是家庭作业吗?您尝试过什么?是“输入”一个包含文件路径列表的文件,还是只是向我们显示您的目录结构?如果是前者,那么您可以使用awk;如果是后者,那么这是shell的工作,而不是awk,您应该使用
find
+
basename
或类似工具。您一定需要使用awk吗?这看起来是
dirname
basename
的完美工作。否则,“文件名”(它可能是一个目录,除非你真的做了一个统计,否则你无法知道,这实际上不是一个awk的东西)是在最后一个“/”之后的东西(比如
匹配($0,(/[^/]+)/([^/]+)$”,a
然后从a中选择开始/长度)。我应该用目录名和文件名将其拆分,然后将其放入数据库。之后,我将使用该信息连接其他表。我需要使用awk。您能告诉我如何使用awk完成此操作吗?谢谢。这是作业吗?您尝试了什么?是“输入”一个包含文件路径列表的文件,或者您只是在向我们显示您的目录结构?如果是前者,那么您可以使用awk,如果是后者,那么这是shell的作业,而不是awk,您应该使用
find
+
basename
或类似的方法。您需要使用awk吗?这看起来是
dirname
的完美作业>另外,“文件名”(可能是一个目录,除非你真的做了一个统计,否则你无法知道,这实际上不是一个awk的东西)是在最后一个“/”之后的东西(因此类似于
匹配($0,(/[^/]+)/([^/]+)$”,a
然后从a中选择开始/长度)。我应该用目录名和文件名将其拆分,然后将其放入数据库。之后,我将使用该信息连接其他表。我需要使用awk。您能告诉我如何使用awk完成此操作吗?谢谢。我认为长度(行)应为'length($0)是这样吗?这样的话,它工作得很好,这就是我真正想要的。很简单。谢谢。哇-是的,@Sigularity;fixed.Ah。我知道了。它工作得很好。事实上,我不介意任何。我只是可以得到目录名和文件名,而不需要任何缩进。就是这样。谢谢。我认为长度(行)应该是“长度($0”)是这样吗?这样的话,它工作得很好,这就是我真正想要的。很简单。谢谢。哇-是的,@Sigularity;fixed.Ah。我知道了。它工作得很好。事实上,我不介意任何。我只需要得到目录名和文件名,而不需要任何缩进。就是这样。谢谢。