Unix 提取目录名并将其放在列表的顶部

Unix 提取目录名并将其放在列表的顶部,unix,sed,awk,ksh,Unix,Sed,Awk,Ksh,大家好 我想知道是否有办法将目录名插入顶部并重新打印列表,使其看起来像这样。非常感谢 Aug 1 2013 /home/s/tone/TONE/gong1 Aug 1 2013 /home/s/tone/TONE/gong1.x Aug 1 2013 /home/s/tone/TONE/gong2 Aug 1 2013 /home/s/tone/TONE/gong1.kbd Aug 1 2013 /home/s/tone/TONE/gong2.x Aug 1 2013 /home/s/tone/

大家好

我想知道是否有办法将
目录名插入顶部并重新打印列表,使其看起来像这样。非常感谢

Aug 1 2013 /home/s/tone/TONE/gong1
Aug 1 2013 /home/s/tone/TONE/gong1.x
Aug 1 2013 /home/s/tone/TONE/gong2
Aug 1 2013 /home/s/tone/TONE/gong1.kbd
Aug 1 2013 /home/s/tone/TONE/gong2.x
Aug 1 2013 /home/s/tone/TONE/gong2.kbd
Aug 1 2013 /home/s/tone/TONE/gong3.kbd
Oct 10 2013 /home/s/man/whatisSPEC
Oct 10 2013 /home/s/man/man3/ctx.3
Oct 10 2013 /home/s/man/man3/sos.3
Oct 10 2013 /home/s/man/man3/dt.3
Oct 10 2013 /home/s/man/man3/timexpr.3
Oct 10 2013 /home/s/man/man3/mpusw.3
Oct 10 2013 /home/s/man/man3/mpu.err.3
Oct 10 2013 /home/s/man/man3/dbr.3
Oct 10 2013 /home/s/man/man3/psi.err.3
Oct 10 2013 /home/s/man/man3/stapo.3

我假设您的输入数据在一个文件中。所以我用你的输入数据创建了一个文件。在我的服务器中是这样的

cat sample.txt

TONE
Aug 1 2013 /home/s/tone/TONE/gong1
Aug 1 2013 /home/s/tone/TONE/gong1.x
Aug 1 2013 /home/s/tone/TONE/gong2
Aug 1 2013 /home/s/tone/TONE/gong1.kbd
Aug 1 2013 /home/s/tone/TONE/gong2.x
Aug 1 2013 /home/s/tone/TONE/gong2.kbd
Aug 1 2013 /home/s/tone/TONE/gong3.kbd
man
Oct 10 2013 /home/s/man/whatisSPEC
man3
Oct 10 2013 /home/s/man/man3/ctx.3
Oct 10 2013 /home/s/man/man3/sos.3
Oct 10 2013 /home/s/man/man3/dt.3
Oct 10 2013 /home/s/man/man3/timexpr.3
Oct 10 2013 /home/s/man/man3/mpusw.3
Oct 10 2013 /home/s/man/man3/mpu.err.3
Oct 10 2013 /home/s/man/man3/dbr.3
Oct 10 2013 /home/s/man/man3/psi.err.3
Oct 10 2013 /home/s/man/man3/stapo.3
awk -F "/" '{print $(NF-1)}' sample.txt | uniq
所以你可以通过这个命令得到目录名

Aug 1 2013 /home/s/tone/TONE/gong1
Aug 1 2013 /home/s/tone/TONE/gong1.x
Aug 1 2013 /home/s/tone/TONE/gong2
Aug 1 2013 /home/s/tone/TONE/gong1.kbd
Aug 1 2013 /home/s/tone/TONE/gong2.x
Aug 1 2013 /home/s/tone/TONE/gong2.kbd
Aug 1 2013 /home/s/tone/TONE/gong3.kbd
Oct 10 2013 /home/s/man/whatisSPEC
Oct 10 2013 /home/s/man/man3/ctx.3
Oct 10 2013 /home/s/man/man3/sos.3
Oct 10 2013 /home/s/man/man3/dt.3
Oct 10 2013 /home/s/man/man3/timexpr.3
Oct 10 2013 /home/s/man/man3/mpusw.3
Oct 10 2013 /home/s/man/man3/mpu.err.3
Oct 10 2013 /home/s/man/man3/dbr.3
Oct 10 2013 /home/s/man/man3/psi.err.3
Oct 10 2013 /home/s/man/man3/stapo.3
输出

TONE
Aug 1 2013 /home/s/tone/TONE/gong1
Aug 1 2013 /home/s/tone/TONE/gong1.x
Aug 1 2013 /home/s/tone/TONE/gong2
Aug 1 2013 /home/s/tone/TONE/gong1.kbd
Aug 1 2013 /home/s/tone/TONE/gong2.x
Aug 1 2013 /home/s/tone/TONE/gong2.kbd
Aug 1 2013 /home/s/tone/TONE/gong3.kbd
man
Oct 10 2013 /home/s/man/whatisSPEC
man3
Oct 10 2013 /home/s/man/man3/ctx.3
Oct 10 2013 /home/s/man/man3/sos.3
Oct 10 2013 /home/s/man/man3/dt.3
Oct 10 2013 /home/s/man/man3/timexpr.3
Oct 10 2013 /home/s/man/man3/mpusw.3
Oct 10 2013 /home/s/man/man3/mpu.err.3
Oct 10 2013 /home/s/man/man3/dbr.3
Oct 10 2013 /home/s/man/man3/psi.err.3
Oct 10 2013 /home/s/man/man3/stapo.3
awk -F "/" '{print $(NF-1)}' sample.txt | uniq

这里我只帮你获取目录名。我不知道如何将它们打印在每一组行的顶部。

不清楚您从何处获得列表,因此我的假设与

您可以处理此问题:

$ cat sample.txt
> Aug 1 2013 /home/s/tone/TONE/gong1
> Aug 1 2013 /home/s/tone/TONE/gong1.x
> Aug 1 2013 /home/s/tone/TONE/gong2
> Aug 1 2013 /home/s/tone/TONE/gong1.kbd
> Aug 1 2013 /home/s/tone/TONE/gong2.x
> Aug 1 2013 /home/s/tone/TONE/gong2.kbd
> Aug 1 2013 /home/s/tone/TONE/gong3.kbd
> Oct 10 2013 /home/s/man/whatisSPEC
> Oct 10 2013 /home/s/man/man3/ctx.3
> Oct 10 2013 /home/s/man/man3/sos.3
> Oct 10 2013 /home/s/man/man3/dt.3
> Oct 10 2013 /home/s/man/man3/timexpr.3
> Oct 10 2013 /home/s/man/man3/mpusw.3
> Oct 10 2013 /home/s/man/man3/mpu.err.3
> Oct 10 2013 /home/s/man/man3/dbr.3
> Oct 10 2013 /home/s/man/man3/psi.err.3
> Oct 10 2013 /home/s/man/man3/stapo.3
本例中使用的
script.awk
如下所示:

$ awk -f script.awk sample.txt
> TONE
> Aug 1 2013 /home/s/tone/TONE/gong1
> Aug 1 2013 /home/s/tone/TONE/gong1.x
> Aug 1 2013 /home/s/tone/TONE/gong2
> Aug 1 2013 /home/s/tone/TONE/gong1.kbd
> Aug 1 2013 /home/s/tone/TONE/gong2.x
> Aug 1 2013 /home/s/tone/TONE/gong2.kbd
> Aug 1 2013 /home/s/tone/TONE/gong3.kbd
> man
> Oct 10 2013 /home/s/man/whatisSPEC
> man3
> Oct 10 2013 /home/s/man/man3/ctx.3
> Oct 10 2013 /home/s/man/man3/sos.3
> Oct 10 2013 /home/s/man/man3/dt.3
> Oct 10 2013 /home/s/man/man3/timexpr.3
> Oct 10 2013 /home/s/man/man3/mpusw.3
> Oct 10 2013 /home/s/man/man3/mpu.err.3
> Oct 10 2013 /home/s/man/man3/dbr.3
> Oct 10 2013 /home/s/man/man3/psi.err.3
> Oct 10 2013 /home/s/man/man3/stapo.3
开始时,我们将字段分隔符
FS
设置为
/
,这与使用
awk-F”/“
调用相同,但为了清晰起见,我将所有内容都放在脚本中,而不是一行


NF
变量提供每行的字段数,$(NF-1)因此是每行中的最后一个字段(由
/
分隔),这正是目录的名称。现在我们比较一下,如果
lastDir
变量与
$(NF-1)
(当前目录)不同,则覆盖
lastDir
变量并打印它。在任何情况下,我们都使用
$0
打印整行。请注意,
lastDir
变量不需要启动,它只需设置为一个空字符串。

如何首先获得列表?缩短一些:
awk-F/'F=$(NF-1){f=$(NF-1);打印f}1'文件
谢谢大家!感谢所有的投入:)