bash - 排序 |独特 | xargs grep ... 其中行包含空格

标签 bash command-line scripting cygwin

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

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

$ cut -d, -f 5 myfile.csv | sort | uniq -d 

正确返回重复日期的列表

01/01/2005 00:22
01/01/2005 00:37
[snip]    
02/29/2009 23:54

但我不知道如何将其提供给 grep 以提供所有行。 显然,我不能直接使用 xargs,因为输出包含空格。我以为我可以做 uniq -z -d 但出于某种原因,组合这些标志会导致 uniq(显然)不返回任何内容。

所以,鉴于此

 $ cut -d, -f 5 myfile.csv | sort | uniq -d -z | xargs -0 -I {} grep '{}' myfile.csv

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

我知道我可以用 perl 或其他脚本语言来做...但是我固执的本性坚持认为我应该能够用标准的 bash 来做命令行工具,如 sortuniqfindgrepcut 等。

教我吧,bash 大师们。如何使用典型的 cli 工具获取我需要的行列表?

最佳答案

  1. sort -k5,5 将对字段进行排序并避免剪切;
  2. uniq -f 4 将忽略 uniq 的前 4 个字段;
  3. 在 uniq 上加上 -D 会得到所有重复的行(相对于 -d,只会得到一个);
  4. 但是 uniq 需要制表符分隔而不是 csv,所以 tr '\t' ',' 来解决这个问题。

问题是如果您在#5 之后有不同的字段。你们约会的长度都一样吗?您可以向 uniq 添加 -w 16(包括时间)或 -w 10(仅用于日期)。

所以:

tr '\t' ',' < myfile.csv | sort -k5,5 | uniq -f 4 -D -w 16

关于bash - 排序 |独特 | xargs grep ... 其中行包含空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/612439/

相关文章:

bash - 无法理解 Fish shell 中的命令替换

java - Jmeter 中的 Beanshell 脚本

linux - 用于更新 Deluged Interface IP 的 Bash 脚本无法作为 cron 作业运行,但在手动运行时有效

bash - 将海量yaml文件拆分为N个有效yaml文件

bash - 将 nettop 的输出保存到文件 ( mac )

python - 从命令行调用 python 脚本而不先输入 "python"

command-line - 使用 VbScript 静默运行命令行并获取输出?

templates - 如何在项目模板中添加构建阶段?

mysql - Powershell InvalidOperation错误

bash - 从日期中提取分钟值