linux查找并输出特定行和它的前一行且在后面再输出一个空白行的命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux查找并输出特定行和它的前一行且在后面再输出一个空白行的命令相关的知识,希望对你有一定的参考价值。

linux
grep命令1.作用
linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹
配的行打印出来。grep全称是global
regular
expression
print,表示全局正则表达式版本,它的使用权限是所有用户。
2.格式
grep
[options]
3.主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-i:不区分大
小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及
行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
\:
忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$:
匹配正则表达式的结束行。
\<:从匹配正则表达
式的行开始。
\>:到匹配正则表达式的行结束。
[
]:单个字符,如[a]即a符合要求

[
-
]:范围,如[a-z],即a、b、c一直到z都符合要求

。:所有的单个字符。
*
:有字符,长度可以为0。
4.grep命令使用简单实例
$
grep
‘test’
d*
显示所有以d开头的文件中包含
test的行。
参考技术A 1.
您需求不太明确,输出特定行,后面加空行没有意义,比如说输出1-3行,后面就是空的了,为啥还要加空行?
2.
实现方式,grep
+
sed
grep
-n
取行数,sed
-n
'n-1,n-2'
#注意实际用的时候,n-1要算出来,或者脚本里面传参数
3.
例:

[user@master
tmp]$
ll
|
awk
'
print
$3
'
cloudera-scm
clouderauser
hadoop
hdfs
hive
mapred
root
yarn
zookeeper
clouderauser
[user@master
tmp]$
ll
|
awk
'
print
$3
'|
grep
-n
yarn
9:yarn
[user@master
tmp]$
ll
|
awk
'
print
$3
'|
sed
-n
'8,10p'
root
yarn
zookeeper

在每个当前行和上一行 BigQuery 之间查找 MAX、AVG

【中文标题】在每个当前行和上一行 BigQuery 之间查找 MAX、AVG【英文标题】:Find MAX, AVG between every current and previous row BigQuery 【发布时间】:2020-12-01 07:06:55 【问题描述】:

我有一个包含 150.000 行的表,其中包含 DateTime 和 Speed 列。行之间的时间戳差异为 10 秒。我想为每 20 秒段(2x 10 秒)计算 Speed 列的 MAX 和 AVG,所以基本上将每个当前行与其前一行进行比较并计算 Speed 列的 MAX 和 AVG。

预期结果:

DateTime                  Speed   MAXspeed   AVGspeed
2019-03-21 10:58:34 UTC     52                 
2019-03-21 10:58:44 UTC     50       52          51
2019-03-21 10:58:54 UTC     55       55          52.5
2019-03-21 10:59:04 UTC     60       60          57.5
2019-03-21 10:59:14 UTC     65       65          62.5
2019-03-21 10:59:24 UTC     63       65          64
2019-03-21 10:59:34 UTC     50       63          56.5
2019-03-21 10:59:44 UTC     50       50          50
2019-03-21 10:59:54 UTC     50       50          50
... 

我尝试了下面的查询,但显然是错误的:

select *,
      MAX(SpeedGearbox_km_h, LAG(SpeedGearbox_km_h) over (order by DateTime)) as Maxspeeg,
      AVG(SpeedGearbox_km_h, LAG(SpeedGearbox_km_h) over (order by DateTime)) as AVGspeed,
    from `xx.yy` 
    group by 1,2
    order by DateTime

【问题讨论】:

【参考方案1】:

只需在查询中使用ROWS BETWEEN 1 PRECEDING AND CURRENT ROW:

SELECT *,
  MAX(SpeedGearbox_km_h) OVER (ORDER BY DateTime ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) as MAXspeed,
  AVG(SpeedGearbox_km_h) OVER (ORDER BY DateTime ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) as AVGspeed
FROM `xx.yy` 
ORDER BY DateTime

【讨论】:

感谢您的帮助!我收到此错误消息:ORDER BY 键必须是基于 RANGE 的窗口中的数字,具有 OFFSET PRECEDING 或 OFFSET FOLLOWING 边界,但在 [2:32] 处具有 TIMESTAMP 类型 我明白了。我需要将 RANGE 更改为 ROWS,它起作用了! 抱歉,已修复。 :)

以上是关于linux查找并输出特定行和它的前一行且在后面再输出一个空白行的命令的主要内容,如果未能解决你的问题,请参考以下文章

当前行和上一行之间具有特定值的窗口函数

linux shell命令怎么查找文件中指定字符串,并把这个字符串所在行和下面一行的内容写到另外一个文件中?

在每个当前行和上一行 BigQuery 之间查找 MAX、AVG

win10查看文件的前n行和后n行

杨辉三角形

杨辉三角