我有一个逗号分隔的文件“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
来做命令行工具,如 sort
、uniq
、find
、grep
、cut
等。
教我吧,bash 大师们。如何使用典型的 cli 工具获取我需要的行列表?
最佳答案
- sort -k5,5 将对字段进行排序并避免剪切;
- uniq -f 4 将忽略 uniq 的前 4 个字段;
- 在 uniq 上加上 -D 会得到所有重复的行(相对于 -d,只会得到一个);
- 但是 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/