Parsing 使用bash解析文件,查找第一个唯一值
我有一个csv文件,我正试图在bash中解析它。每行的第一个字段是格式为yyyy-mm-dd hh:mm:ss的时间戳。每10分钟生成六行,我在下面添加了一个小示例 我想做的是每天都能拿到前6行。每天的第一个条目可以在00:00:xx和00:10:xx之间的任何时间发生,因此“00:0”的grep不起作用 2010-04-23 00:04:43,0.0,046667243217666528866628866,0.92,65,Parsing 使用bash解析文件,查找第一个唯一值,parsing,bash,file,Parsing,Bash,File,我有一个csv文件,我正试图在bash中解析它。每行的第一个字段是格式为yyyy-mm-dd hh:mm:ss的时间戳。每10分钟生成六行,我在下面添加了一个小示例 我想做的是每天都能拿到前6行。每天的第一个条目可以在00:00:xx和00:10:xx之间的任何时间发生,因此“00:0”的grep不起作用 2010-04-23 00:04:43,0.0,046667243217666528866628866,0.92,65, 2010-04-23 00:04:43,0.1,04666724321
2010-04-23 00:04:43,0.1,0466672432176632083220832,0.62,65,
2010-04-23 00:04:43,0.2,0466672432176621470214702,0.46,65,
2010-04-23 00:04:43,0.3,04666724321766642773927739,0.92,65,
2010-04-23 00:04:43,0.4,04666724321766642510525105,0.77,65,
2010-04-23 00:04:43,0.5,0466672432176642454624546,0.77,65,
2010-04-23 00:14:43,0.0,04666724321766529226226,0.92,65,
2010-04-23 00:14:43,0.1,0466672432176632155221552,0.62,65,
2010-04-23 00:14:43,0.2,0466672432176621542215422,0.46,65,
2010-04-23 00:14:43,0.3,04666724321766642845928459,0.92,65,
2010-04-23 00:14:43,0.4,04666724321766642582525825,0.77,65,
2010-04-23 00:14:43,0.5,04666724321766642526625266,0.77,65,
2010-04-23 00:24:43,0.0,0466672432176652958629586,0.92,65,
2010-04-23 00:24:43,0.1,0466672432176632227272,0.77,65,
依此类推到
2010-04-24 00:05:02,0.0,0466672432177017138871388,2.31,65,
2010-04-24 00:05:02,0.1,0466672432177017026470264,2.31,65,
2010-04-24 00:05:02,0.2,0466672432177006125461254,2.00,65,
2010-04-24 00:05:02,0.3,04666724321770117101111,2.31,65,
2010-04-24 00:05:02,0.4,0466672432177016811168111,2.15,65,
2010-04-24 00:05:02,0.5,0466672432177026904699904,2.31,65 想法、评论?
Bob它可以简单地使用带有两种模式的grep:
grep -e " 00:0" -e " 00:10" myFIle.csv
第一个模式将在
00:00
到00:09
之间匹配,第二个模式将找到00:10
它可以像使用两个模式的grep一样简单:
grep -e " 00:0" -e " 00:10" myFIle.csv
第一个模式将在
00:00
到00:09
之间匹配,第二个模式将发现00:10
使用Perl应该很容易:
perl -ane '$l = 0 if $F[0] ne $d; print if $l++ < 6; $d = $F[0]' file
perl-ane'$l=0如果$F[0]ne$d;如果$l++<6,则打印$d=$F[0]”文件
使用Perl应该很容易:
perl -ane '$l = 0 if $F[0] ne $d; print if $l++ < 6; $d = $F[0]' file
perl-ane'$l=0如果$F[0]ne$d;如果$l++<6,则打印$d=$F[0]”文件
下面使用带有自定义IFS
(=输入字段分隔符)设置的read
,将输入行拆分为日期时间字段和其余字段,然后使用bash的子字符串操作符从ISO日期时间提取日期,然后基本上继续打印接下来的N行。在echo
的位置,您可能希望对结果执行任何处理,因为read
+echo
不会准确保留输入
function first_n_of_each_day() {
local N="$1"
local lastDateTime=""
local I=0
while IFS=',' read DATETIME OTHER ; do
local DATE="${DATETIME:0:10}"
if [ "$DATE" != "$lastDateTime" ] ; then
I=0
lastDateTime="$DATE"
fi
if [ $I -lt "$N" ] ; then
let ++I
# line matches:
echo "$DATETIME,$OTHER"
fi
done
}
first_n_of_each_day 6 < file.csv
函数每天的第一个函数(){
本地N=“$1”
本地lastDateTime=“”
局部I=0
当IFS=','读取DATETIME其他时;执行
本地日期=“${DATETIME:0:10}”
如果[“$DATE”!=“$lastDateTime”];则
I=0
lastDateTime=“$DATE”
fi
如果[$I-lt“$N”];则
让我
#行匹配:
echo“$DATETIME$OTHER”
fi
完成
}
每天的第一天6
下面使用带有自定义IFS
(=输入字段分隔符)设置的read
,将输入行拆分为日期时间字段和其余字段,然后使用bash的子字符串操作符从ISO日期时间提取日期,然后基本上继续打印接下来的N行。在echo
的位置,您可能希望对结果执行任何处理,因为read
+echo
不会准确保留输入
function first_n_of_each_day() {
local N="$1"
local lastDateTime=""
local I=0
while IFS=',' read DATETIME OTHER ; do
local DATE="${DATETIME:0:10}"
if [ "$DATE" != "$lastDateTime" ] ; then
I=0
lastDateTime="$DATE"
fi
if [ $I -lt "$N" ] ; then
let ++I
# line matches:
echo "$DATETIME,$OTHER"
fi
done
}
first_n_of_each_day 6 < file.csv
函数每天的第一个函数(){
本地N=“$1”
本地lastDateTime=“”
局部I=0
当IFS=','读取DATETIME其他时;执行
本地日期=“${DATETIME:0:10}”
如果[“$DATE”!=“$lastDateTime”];则
I=0
lastDateTime=“$DATE”
fi
如果[$I-lt“$N”];则
让我
#行匹配:
echo“$DATETIME$OTHER”
fi
完成
}
每天的第一天6的awk版本的答案
awk'
$1 != 日期{count=0;日期=1}
++计算awk版本的用户答案
awk'
$1 != 日期{count=0;日期=1}
++计数这很好,但在00:00有条目的日子,它也会在00:10拾取条目。感谢您提醒我-这很好,但在00:00有条目的日子里,它也会在00:10接收条目。谢谢你提醒我-就是这样!我的解决方案是这样开始的,但在这个过程中我的大脑转向了木薯。。谢谢就是这样!我的解决方案是这样开始的,但在这个过程中我的大脑转向了木薯。。谢谢很好的解决方案。。。有一天我真的需要学习一些perl。很好的解决方案。。。我真的需要有一天学习一些perl。