使用 sed 或 awk 在行前添加文件前缀

使用 sed 或 awk 在行前添加文件前缀

如何更改示例输入文件以获得类似于下面的输出文件的内容?

输入文件:

/tmp/日志
2015 年 10 月 13 日 00:19:13 温度日志1
10/13/15 00:19:13 虚拟日志
2015年10月13日 01:19:12 测试
2015 年 10 月 13 日 01:19:12 错误
/tmp/错误
2015 年 10 月 13 日 00:16:10 x
2015 年 10 月 13 日 00:16:10
2015 年 10 月 13 日 01:16:10
2015 年 10 月 13 日 01:16:10
/tmp/访问
2015 年 10 月 13 日 00:56:14 b
2015 年 10 月 13 日 00:56:14

输出文件:

/tmp/日志 10/13/15 00:19:13 templogs1
/tmp/logs 10/13/15 00:19:13 虚拟日志
/tmp/logs 10/13/15 01:19:12 测试
/tmp/logs 10/13/15 01:19:12 错误
/tmp/错误 10/13/15 00:16:10 x
/tmp/错误 10/13/15 00:16:10 y
/tmp/错误 10/13/15 01:16:10 z
/tmp/错误 10/13/15 01:16:10 a
/tmp/access 10/13/15 00:56:14 b
/tmp/access 10/13/15 00:56:14 c

答案1

尝试用sed

sed '
    /^\//{                    # execite block if line start with «/»
        h                     # put line into hold-space
        d                     # clean, return to beginning
        }                     # end block
    G                         # append hold-space to line
    s/\(.*\)\n\(.*\)/\2 \1/   # exchange first and last part of line
    ' input.file > output.file

和其他变体

sed '
    /^\//{                    # execute from line started with «/»
        :1                    # mark return point
        N                     # get next line
        /\n\//D               # if such next line started «/» remove previous
                              #+and starts from the beginning with last line
        s/\n/ /p              # change newline with space and prints both lines
        s/ .*//               # removes last line
        $!b1                  # return to marked point with fist line if not end
        d                     # clean all (finish)
        }
    ' input.file > output.file

答案2

尝试

awk 'substr($1,1,1) == "/"  { prefix=$0 ; next ; }
   { printf "%s %s\n",prefix,$0;}' 

这将捕获以 ' /' 开头的前缀...

相关内容