我有一个select指定行的问题,并join每一行第二行。
即我有两个文件:
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'
收益:
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
现在我必须join一个第二行。 我的意思是:
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
还有一个问题。 如何用date和时间select与grep 2015不同的东西,因为明年的date将从2016年开始,我将不得不改变脚本。
谢谢。
既然你计划使用awk
, grep
可以被保存, cat
无论如何都是无用的。
这awk单线程做你的工作。
awk '/^2015/{printf "%s%s",(NR>1?"\n":""),$0}/lol1/{printf " %s",$0}' f1 f2
f1, f2
是你的两个文件。 它给出了预期的输出。
上面的行不遵循every second line
规则,而是用timestamp对lol1
数据进行分组,这可能是你的真正需求。
您可以将其传递给以下awk
命令:
... | awk 'NR%2{last=$0;next}{print last, $0}'
它将整行存储到last
变量的last
一行,并在last
一行加上偶数行last
的当前行。
或更短:
... | awk '!(NR%2){print l, $0}{l=$0}'
awk来拯救! 你不需要cat / grep。
$ awk '/^[0-9-]{10}/{printf $0 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=$0} /lol1/{print t, $0}' 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