如何将两条线合二为一
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
备注
f1, f2
是你的两个文件。它给出了预期的输出。
上面的行不遵循 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
我对指定行的 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
备注
f1, f2
是你的两个文件。它给出了预期的输出。上面的行不遵循
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