排序| uniq | xargs grep ...行包含空格

Suk*_*tto 4 bash scripting command-line cygwin

我有一个逗号分隔文件"myfile.csv",其中第5列是日期/时间戳.(mm/dd/yyyy hh:mm).我需要列出包含重复日期的所有行(有很多)

我正在通过cygwin为WinXP使用bash shell

$ cut -d, -f 5 myfile.csv | sort | uniq -d 
Run Code Online (Sandbox Code Playgroud)

正确返回重复日期的列表

01/01/2005 00:22
01/01/2005 00:37
[snip]    
02/29/2009 23:54
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何将这个提供给grep给我所有的行.显然,我不能xargs直接使用,因为输出包含空格.我认为我可以这样做,uniq -z -d但由于某种原因,组合这些标志会导致uniq(显然)没有返回任何内容.

所以,鉴于此

 $ cut -d, -f 5 myfile.csv | sort | uniq -d -z | xargs -0 -I {} grep '{}' myfile.csv
Run Code Online (Sandbox Code Playgroud)

不起作用......我该怎么办?

我知道我可以做到这一点perl或其他脚本语言......但我生性倔强坚持认为我应该能够做到这一点在bash使用标准的命令行工具,如sort,uniq,find,grep,cut,等.

教我,哦,打击大师.如何使用典型的cli工具获取所需的行列表?

And*_*ett 10

  1. sort -k5,5将对字段进行排序并避免剪切;
  2. uniq -f 4将忽略uniq的前4个字段;
  3. 再加上uniq上的-D将获得所有重复的行(vs -d,它只能获得一个);
  4. 但uniq会期望使用制表符分隔而不是csv,所以tr'\ t'','来修复它.

问题是如果#5之后的字段不同.你的约会时间长度是一样的吗?您可以将-w 16(包含时间)或-w 10(仅适用于日期)添加到uniq.

所以:

tr '\t' ',' < myfile.csv | sort -k5,5 | uniq -f 4 -D -w 16
Run Code Online (Sandbox Code Playgroud)