【问题标题】:How can I extract a substring from the results of a cut command in unix?如何从 unix 中的 cut 命令的结果中提取子字符串?
【发布时间】:2011-07-24 15:06:46
【问题描述】:

我有一个文件是 '|'划定的。文件中的字段之一是时间戳。该字段采用以下格式:MM-dd-yyyy HH:mm:ss 我希望能够打印到文件中的唯一日期。我可以使用 cut 命令 (cut -f1 -d'|' _file_name_ |sort|uniq) 来提取唯一日期。但是,对于该领域的时间部分,我看到了数百个结果。运行 cut 命令后,我想使用前 11 个字符的子字符串来显示唯一日期。我尝试使用 awk 命令,例如: awk ' { print substr($1,1-11) }' | cut -f1 -d'|' _file_name_ |sort|uniq > _output_file_

我运气不好。我会以错误的方式解决这个问题吗?有没有更简单的方法来提取我需要的数据。任何帮助将不胜感激。

【问题讨论】:

  • 请。添加到目前为止您获得的输出示例,以及您希望它的外观示例。
  • Smith|John|smithj|1234567|8910|Smoe|Joe|2011-03-27 04:04:04|123 Main St|Tampa|FL|33611|输出:2011-03-27

标签: unix scripting awk cut


【解决方案1】:

cut -c1-11 将显示每个输入行的字符 1-11。

【讨论】:

  • 对不起,我在问题中将 -f 设置为 1。但是,该字段实际上位于分隔文本文件的位置 10。因此,当我尝试cut -f10 -d'|' -c1-11 my_file.txt |sort|uniq 时出现错误。 “只能指定一种类型的列表。”
  • cut -f10 -d'|' my_file.txt | cut -c1-11 | sort -u 应该可以。
  • 当然,如果你想避免awk。我认为使用它比建造长管道更好。
【解决方案2】:

如果日期是文件中的第一个(空格分隔)字段,那么唯一日期列表就是:

cut -f1 -d' ' filename | sort -u

更新:除了@shellter 的正确答案,我只提供一个替代方案来演示其他 awk 工具:

awk '{split($10, a); date[a[1]]++} END {for (d in date) print d}' filename

【讨论】:

  • 谢谢格伦,请参阅第一个答案下的评论。字段的位置不在行首。
【解决方案3】:

你们都在那里。这是基于日期时间戳在字段 1 中的想法。

编辑:将字段更改为 10,还使用 ​​-u 选项进行排序,而不是使用 uniq 的 sep 进程

您不需要剪辑,awk 会为您完成。

awk -F"|" ' { print substr($10,1,11) }'  _file_name_ |sort -u > _output_file_

我希望这会有所帮助。

附:由于您似乎是新用户,如果您得到的答案对您有帮助,请记住将其标记为已接受,或者给它一个 +(或 -)作为有用的答案

【讨论】:

  • 谢谢,这正是我所需要的。
  • -u 选项有什么作用?
  • 你有 | uniq ;这是一个额外的过程,因为 sort 具有执行相同操作的 '-u' 选项(在对数据进行排序时)。但是,鉴于您正在处理的数据类型,您可能会发现 ... | sort | uniq -c 提供了一个有趣的统计数据。 uniq 的-c 选项显示您找到的记录的计数。然后您会看到,例如,2011-03-25 有 5270 次访问,而 201-03-27 只有 10 次。根据您的操作,这类信息可能会有所帮助。我希望这会有所帮助。
猜你喜欢
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2020-12-30
  • 1970-01-01
  • 2010-10-25
  • 2022-06-14
相关资源
最近更新 更多