2014-03-06 31 views
0

我是Linux新手,我尝试在bash文件中操作一些数据。我尝试了许多解决方案,但没有取得任我有一个让我失去了我自己到了太多的命令三个条件:CSV数据比较Linux

  1. 比较,如果XX:XX:XX:XX:XX(第3列)是文件

  2. 如果它已经存在已经发现,比较包含相同xx的所有行的时间(第1列):xx:xx:xx:xx:xx

  3. 如果时间相同,比较信号强度(第2列)并发回与最低值一致。

数据文件(CSV):

Mar 6 2014 17h29h43, -55, xx:xx:xx:xx:xx (This line has to be removed) 
Mar 6 2014 17h29h43, -38, xx:xx:xx:xx:xx 
Mar 6 2014 17h29h44, -60, yy:yy:yy:yy:yy 

祝愿结果:

Mar 6 2014 17h29h43, -38, xx:xx:xx:xx:xx (=> lowest value for xx:xx:xx:xx 17h29h43) 
Mar 6 2014 17h29h44, -60, yy:yy:yy:yy:yy 
+0

欢迎[所以]。请提供您尝试的解决方案/代码,并告诉我们出了什么问题。这样你会找到更好的答案和帮助。 –

+0

这是必须在bash中完成的原因吗?您应该使用awk或perl来执行此类处理。 –

+0

查看['csvfix'](https://code.google.com/p/csvfix/)是否可以提供帮助;它是用于处理CSV文件的非常强大的工具。或者,这看起来像是'awk'的工作。 –

回答

0

你或许应该这样做在Perl/Python的,但我很无聊,为什么不:

#!/usr/bin/env bash 

filename=$1 

#read input file and store into associative array 
declare -A arr 
while IFS=',' read date value string ; do 
    #Change time from 10h00h00 to 10:00:00 
    dt=$(sed s'/\([0-9]\+\)h/\1:/g' <<< "$date") 
    #Get rid of leading spaces 
    string=$(tr -d ' ' <<< "$string") 
    value=$(tr -d ' ' <<< "$value") 
    #Convert datetime to unix epoch 
    epoch=$(date --date="$dt" +%s) 
    #echo "$epoch,$string" 

    #Create unique key for array 
    key="$epoch,$string" 

    #Check if key already exists if so compare 
    #values and keep the highest  
    ov=-10000 
    [ ${arr["$key"]+abc} ] && ov=${arr["$key"]} 

    if [[ "$value" -gt "$ov" ]]; then 
     arr["$key"]="$value" 
    fi 
done < "$filename" 

#Display output, sort on epoch and then remove from output 
for i in ${!arr[@]}; do 
    #Split key into epoch and string 
    epoch=$(awk -F, '{print $1}' <<< $i) 
    string=$(awk -F, '{print $2}' <<< $i) 

    #Convert date back to long format 
    dt=$(date [email protected]"$epoch" '+%h %-d %Y %Hh%Mh%S') 

    echo "$epoch $dt, ${arr[$i]} $string" 
done | sort -h | sed 's/^[0-9]\+ //' 

输入文件(数据文件):

Mar 6 2014 17h29h43, -55, xx:xx:xx:xx:xx 
Mar 6 2014 17h29h43, -38, xx:xx:xx:xx:xx 
Mar 6 2014 17h29h44, -60, yy:yy:yy:yy:yy 
Mar 9 2014 07h29h44, -6, 11:22:33:44:55 
Mar 9 2014 07h29h44, 6, 22:33:44:55:66 
Mar 9 2014 07h29h44, 3, 22:33:44:55:66 
Mar 1 2014 14h33h04, -60, anythingreally 

输出:

Mar 1 2014 14h33h04, -60 anythingreally 
Mar 6 2014 17h29h43, -38 xx:xx:xx:xx:xx 
Mar 6 2014 17h29h44, -60 yy:yy:yy:yy:yy 
Mar 9 2014 07h29h44, -6 11:22:33:44:55 
Mar 9 2014 07h29h44, 6 22:33:44:55:66