![用于从 .csv 文件的特定列中单独过滤日期并将输出保存在另一个 csv 文件中的 shell 脚本](https://linux22.com/image/119488/%E7%94%A8%E4%BA%8E%E4%BB%8E%20.csv%20%E6%96%87%E4%BB%B6%E7%9A%84%E7%89%B9%E5%AE%9A%E5%88%97%E4%B8%AD%E5%8D%95%E7%8B%AC%E8%BF%87%E6%BB%A4%E6%97%A5%E6%9C%9F%E5%B9%B6%E5%B0%86%E8%BE%93%E5%87%BA%E4%BF%9D%E5%AD%98%E5%9C%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%20csv%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%20shell%20%E8%84%9A%E6%9C%AC.png)
7/20/2017 17:00
例如,考虑一个 .csv 文件,其日期格式列在第六列中 。
如果我给出输入,7/11/2017
那么它应该过滤具有匹配输入日期的列,并且输出应该保存在另一个 .csv 文件中
我需要一个命令来根据给定的输入过滤第六列。
file.csv 具有以下条目:
23,54,one,tree,56,7/20/2017 17:00,23,iii,89
23,54,one,tree,56,7/20/2017 17:00,23,iii,89
23,54,one,tree,56,7/21/2017 17:00,23,iii,89
23,54,one,tree,56,7/30/2017 17:00,23,iii,89
同样,第六列中的多个日期和时间格式的条目。在运行时给出的输入(例如 read )7/20/2017
,然后它应该过滤第 6 列中的日期并将输出条目保存到另一个 .csv 文件。
答案1
简单地与awk:
awk -F, -v d="7/20/2017" '$6~d' input.csv > dates.csv
内容dates.csv
:
23,54,one,tree,56,7/20/2017 17:00,23,iii,89
23,54,one,tree,56,7/20/2017 17:00,23,iii,89
如果日期值来自 shell 变量:
d="7/20/2017"
awk -F, -v d="$d" '$6~d' input.csv > dates.csv
答案2
假设只有一列具有该格式的日期:
$ grep -F '7/20/2017' file.csv
23,54,one,tree,56,7/20/2017 17:00,23,iii,89
23,54,one,tree,56,7/20/2017 17:00,23,iii,89
您可以将其重定向到一个新文件:
$ grep -F '7/20/2017' file.csv >new.csv
要正确解析 CSV 文件,请使用 CSV 解析器,例如内置的解析器CSVkit 工具:
$ csvgrep -c 6 -m '7/20/2017' file.csv
23,54,one,tree,56,7/20/2017 17:00,23,iii,89
23,54,one,tree,56,7/20/2017 17:00,23,iii,89