如何将两条线合二为一

How to join two lines in one

我对指定行的 select 有问题,并且将每两行连接成一行。

即我有两个文件:

cat lol1.txt
2015-11-15 12:44:34
Name    Value1  Value2
lol1    3   2
lol2    2   5
2015-11-15 12:44:44
Name    Value   Value2
lol1    7   1
lol2    5   1
2015-11-15 12:44:54
Name    Value   Value2
lol1    3   9
lol2    9   2

cat lol2.txt
2015-11-16 10:23:31
Name    Value   Value2
lol1    3   4   
lol2    4   7
2015-11-16 10:23:41
Name    Value   Value2
lol1    7   5
lol2    9   2
2015-11-16 10:23:51
Name    Value   Value2
lol1    2   4   
lol2    2   5

和命令:

cat lol.txt lol2.txt | grep 'lol1\|2015'

returns:

2015-11-15 12:44:34
lol1    3   2
2015-11-15 12:44:44
lol1    7   1
2015-11-15 12:44:54
lol1    3   9
2015-11-16 10:23:31
lol1    3   4   
2015-11-16 10:23:41
lol1    7   5
2015-11-16 10:23:51
lol1    2   4   

现在我必须将每一行都加入一行。我的意思是:

2015-11-15 12:44:34 lol1    3   2
2015-11-15 12:44:44 lol1    7   1
2015-11-15 12:44:54 lol1    3   9
2015-11-16 10:23:31 lol1    3   4
2015-11-16 10:23:41 lol1    7   5
2015-11-16 10:23:51 lol1    2   4   

还有一个问题。如何使用 grep 2015 以外的东西选择带有日期和时间的行,因为明年日期将从 2016 年开始,我将不得不更改脚本。

谢谢。

您可以将其通过管道传输到以下 awk 命令:

... | awk 'NR%2{last=[=10=];next}{print last, [=10=]}'

它在奇数行上将整行存储到变量 last 中,并在偶数行上打印 last 加上当前行。

或更短:

... | awk '!(NR%2){print l, [=11=]}{l=[=11=]}'

既然你打算用awk,那grep就可以省下来,cat反正没用

这个 awk 单行代码可以完成您的工作。

awk '/^2015/{printf "%s%s",(NR>1?"\n":""),[=10=]}/lol1/{printf " %s",[=10=]}' f1 f2

备注

  1. f1, f2 是你的两个文件。它给出了预期的输出。

  2. 上面的行不遵循 every second line 规则,而是按时间戳对 lol1 数据进行分组,这可能是您的实际要求。

awk 助你一臂之力!你不需要 cat/grep.

 $ awk '/^[0-9-]{10}/{printf [=10=] FS} /lol1/' lol1.txt
2015-11-15 12:44:34 lol1    3   2
2015-11-15 12:44:44 lol1    7   1
2015-11-15 12:44:54 lol1    3   9

您可以扩展文件列表。第一个模式是一个简单的日期内容模式;根据你的数据应该足够了,如果不容易转换成更好的。

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

$ awk '/-/{t=[=10=]} /lol1/{print t, [=10=]}' lol1.txt lol2.txt
2015-11-15 12:44:34 lol1    3   2
2015-11-15 12:44:44 lol1    7   1
2015-11-15 12:44:54 lol1    3   9
2015-11-16 10:23:31 lol1    3   4
2015-11-16 10:23:41 lol1    7   5
2015-11-16 10:23:51 lol1    2   4