基于模式合并线条

时间:2016-03-23 11:02:42

标签: bash awk sed

我一直在努力弄清楚如何解开'日志文件中的行(带有2个新行分隔符 - ' @'和' |')所以与一个时间戳相关的所有行都在一行上。

Example:
2016-03-22 blah blah blah
|blah blah
|blah blah blah
@blah 
|blah blah blah
2016-03-22 blah blah blah
|blah blah blah
@blah blah
@blah blah blah
|blah 

必需的输出

2016-03-22 blah blah blah |blah blah |blah blah blah @blah |blah blah blah
2016-03-22 blah blah blah |blah blah blah @blah blah @blah blah blah |blah

我以为我只是通过使用xarg将所有内容放在一行然后使用sed在2016年添加新行来解决这个问题但是我发现一行上的字符有一个限制而且日志文件是如此大的xargs创建多行。

从以|开头的行中删除回车符和@会解决这个问题,但也无法理解如何做到这一点。

我在这里搜索过,发现有些人发布了类似的问题,但我无法解释一些解决方案以适应我的问题,因为我对sed / awk不够熟悉/ xargs的。

如果有人能提出一些建议,我们将不胜感激。

由于

5 个答案:

答案 0 :(得分:1)

您可以使用此awk命令:

awk '/^[0-9]{4}(-[0-9]{2}){2}/ {
   if (p!="")
      print p
   p=$0
   next
}
{
   p = p OFS $0
}
END { 
   print p
}' file

2016-03-22 blah blah blah |blah blah |blah blah blah @blah |blah blah blah
2016-03-22 blah blah blah |blah blah blah @blah blah @blah blah blah |blah

答案 1 :(得分:0)

anubhava的答案有效但在打印之前它会缓冲每一行的全部内容。

在读取每个输入行时打印。

awk '{printf "%s%s", /^[|@]/?OFS:(NR>1)?"\n":"", $0} END{print ""}'
  • /^[|@]/匹配以@|
  • 开头的行
  • ?OFS如果与OFS匹配导致(输出字段分隔符,默认为空格)
  • :否则
    • (NR>1)如果我们不在第一行
    • ?"\n"输出换行符
    • :""否则输出空白(以避免输出顶部出现空白行)
  • END{print ""}确保我们以换行符结束最后一行

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed ':a;N;/\n....-..-.. /!s/\n/ /;ta;P;D' file

在模式空间中读取两行,如果换行符不是新记录的开头,则用空格替换它并重复,即将另一行附加到现有行等。 如果追加的行是新记录的开头,则打印第一行,删除它并重复。

答案 3 :(得分:0)

删除换行符,在行尾添加换行符,并在每个2016年之前插入换行符:

echo '2016-03-22 blah blah blah
|blah blah
|blah blah blah
@blah
|blah blah blah
2016-03-22 blah blah blah
|blah blah blah
@blah blah
@blah blah blah
|blah ' | tr -d '\n' | sed -e 's/$/\n/' -e 's/2016-/\n2016-/g'

答案 4 :(得分:0)

但是当这两个文件中存在这个词时,如何合并线条(只有线条中的单词)? 所有单词都在自动更改,文件1.txt和2.txt也会自动更改,作为Gnome 2环境中包管理器脚本的一部分。并且"链接"表示http://link

示例INPUT:

1.txt包含检测到的http和版本的软件包:

LINK1 /自动工具-dev_20100122.1

LINK4 / debhelper_8.0.0

link5 / dreamchess_0.2.0

link5 / dreamchess_0.2.0-2

link7 / quilt_0.48

link7 / quilt_0.48-7

link34 /被子el_0.46.2

link34 /被子el_0.46.2-1

2.txt包含所需的包扩展:

自动工具-dev的_ *。diff.gz

debhelper的_ *。diff.gz

debhelper的_ *。的orig.tar.gz

libmxml-dev的_ *。diff.gz

libmxml-dev的_ *。DSC

libmxml-dev的_ *。的orig.tar.gz

libsdl1.2-dev的_ *。diff.gz

libsdl1.2-dev的_ *。DSC

libsdl1.2-dev的_ *。的orig.tar.gz

libsdl-image1.2-dev的_ *。diff.gz

libsdl-image1.2-dev的_ *。DSC

libsdl-image1.2-dev的_ *。的orig.tar.gz

被子_ *。diff.gz

希望输出到文件3.txt:

LINK1 /自动工具-dev_20100122.1.diff.gz

LINK4 / debhelper_8.0.0.diff.gz

LINK4 / debhelper_8.0.0.orig.tar.gz

libmxml-dev的_ *。diff.gz

libmxml-dev的_ *。DSC

libmxml-dev的_ *。的orig.tar.gz

libsdl1.2-dev的_ *。diff.gz

libsdl1.2-dev的_ *。DSC

libsdl1.2-dev的_ *。的orig.tar.gz

libsdl-image1.2-dev的_ *。diff.gz

libsdl-image1.2-dev的_ *。DSC

libsdl-image1.2-dev的_ *。的orig.tar.gz

link7 / quilt_0.48.diff.gz

link7 / quilt_0.48-7.diff.gz

所需的脚本,自动检测文件1.txt和2.txt中的公共包名称,并将3.txt文件合适地插入到存在包名称的同一行:

  • 来自文件1.txt的http和版本

  • 从文件2.txt扩展

  • 文件2.txt中的行,不包含文件1.txt中的包名称