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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Bash 在CSV上使用awk查找第一列中的日期模式_Bash_Shell_Unix_Awk_Command Line Interface - Fatal编程技术网

Bash 在CSV上使用awk查找第一列中的日期模式

Bash 在CSV上使用awk查找第一列中的日期模式,bash,shell,unix,awk,command-line-interface,Bash,Shell,Unix,Awk,Command Line Interface,我正在尝试对我拥有的CSV目录进行一些数据操作 我想将任何CSV文件中第一列与日期模式匹配的所有行附加到名为“SUMMARY.CSV”的文件中。例如,我希望所有在第一列中有三月日期的行。列包含MM/DD/YYYY格式的日期 数据示例: AWK示例: 预期成果: 实际结果: 出于某种原因,我无法让它可靠地只提取月份等于我在awk语句中输入的行 在此方面的任何帮助都将不胜感激!在这一点上已经做了几天了。你缺少了一个指向字段开头的锚,所以其他地方有一个03匹配。另外,您错误地使用了*,因此实际上您将/

我正在尝试对我拥有的CSV目录进行一些数据操作

我想将任何CSV文件中第一列与日期模式匹配的所有行附加到名为“SUMMARY.CSV”的文件中。例如,我希望所有在第一列中有三月日期的行。列包含MM/DD/YYYY格式的日期

数据示例:

AWK示例:

预期成果:

实际结果:

出于某种原因,我无法让它可靠地只提取月份等于我在awk语句中输入的行


在此方面的任何帮助都将不胜感激!在这一点上已经做了几天了。

你缺少了一个指向字段开头的锚,所以其他地方有一个
03
匹配。另外,您错误地使用了
*
,因此实际上您将
/
设置为可选

请尝试以下方法:

awk -F, '$1 ~ /^03/' *.csv
对于您的数据,它应该足够了<代码>{print}默认情况下发生。请注意,我在
/
中使用的是文本正则表达式,而不是
中的字符串,awk必须编译该字符串

事实上,您可以做得更简单,因为您要匹配第一个字段:

awk -F, '/^03/' *.csv
但从这一点来看,这更像是格雷普的工作:

grep '^03' *.csv


这适用于第一个字段,但请记住,awk和grep不是CSV解析器,因此,一旦您开始执行更复杂的操作,如在引用字段(可能包含逗号)中读取,您应该使用适当的解析器。

添加了
以(^)开头
表达式。否则,它将匹配
$1
字段中的任何位置:

awk -F, '$1 ~ "^03" {print}' *.csv >> SUMMARY.csv
试试这个-

awk -F'[/]' '$1 == 03' f
03/01/2017, "X AuD, Y", "First Last", "X MD, Y", "Loc"

请记住,复制所需的输出并不是唯一有用的答案。正则表达式没有任何意义,您也没有解释对OP尝试所做的更改。感谢您的快速响应!因此,我接受了您的建议,尝试使用
awk-F,'$1~/^03/'*.csv
。这是一个idn不起作用这很奇怪,因为它的值实际上是MM/dd/yyyy。我可以通过使用
awk-F,$1~/^3/'*.csv
使它起作用,它只返回与'03'月匹配的值,但它只经过目录中的第一个csv。这很奇怪,因为我使用的是*.csv,我认为它能让我得到一切。有什么想法吗?@EliSobylak这个问题你描述“拥有”是100%不可能给出你到目前为止告诉我们的东西。因此,还有一些事情你还没有告诉我们。创建一个演示你的问题并发布一个新问题,因为Tom的答案回答了你原来的问题。@EdMorton你是对的。在玩了一些游戏之后,我发现它只使用awk如果我打开文件并单击“保存”,则对其执行命令。在我重新保存文件后,awk会将其拾取。不知道这可能是什么原因……您的初始文件有问题,而您的编辑器正在动态修复它。请在保存之前/之后对文件尝试
head-5 file | cat-v
,以查看编辑器正在更改什么。您又是对的。输出为di保存文件并使用您的命令读取前5行后,请注意。保存文件后,字符串周围的一些引号消失,每行以“^M”结尾。hmmm正则表达式分隔符为
/
,字符串分隔符为
。为了效率、简单性和健壮性,除非需要从字符串创建动态regexp,否则请使用正则表达式分隔符作为regexp。
awk -F, '/^03/' *.csv
grep '^03' *.csv
awk -F, '$1 ~ "^03" {print}' *.csv >> SUMMARY.csv
awk -F'[/]' '$1 == 03' f
03/01/2017, "X AuD, Y", "First Last", "X MD, Y", "Loc"