Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 使用bash解析文件,查找第一个唯一值_Parsing_Bash_File - Fatal编程技术网

Parsing 使用bash解析文件,查找第一个唯一值

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

我有一个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,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。