【问题标题】:convert string ddmmyyyy to yymmdd using linux使用linux将字符串ddmmyy转换为yyyymmdd
【发布时间】:2015-06-23 02:56:10
【问题描述】:

我正在努力转换包含字符串的文本文件:

10.04.2015 12:00:15

150410

日期将始终是日期格式,但取自文本文件,据我所知,我不能使用日期命令,我认为我必须使用 awk,但我不太了解并且正在苦苦挣扎 -建议将不胜感激?

【问题讨论】:

  • 请注意,标题中的格式与输入/所需输出中的格式不同。
  • 干杯,我会接受建议并使用具有更多选项的那个以供以后使用。
  • 如果它是文件中唯一的数据,那么例如awk '{ print substr($0, 7, 2) substr($0, 3, 2) substr($0, 1, 2) }' 但实际上,我们需要了解文件中还有什么。向我们展示一个真正有代表性的样本输入和所需的输出。
  • 如果你能去掉点并用斜线代替它们,date -d"10/04/2015 12:00:15" "+%y%d%m" 就可以了。

标签: linux text awk sed


【解决方案1】:

下面的sed 命令应该够用了:

sed -r 's/([0-9]+)\.([0-9]+)\.[0-9]{2}([0-9]{2}) ([0-9]+:?){3}/\3\2\1/g' input

awk:

awk -F'[.: ]' '{print substr($3,3),$2,$1}' OFS='' input

毕竟我更喜欢后者。

【讨论】:

  • 我最终选择了上述解决方案,因为它对初学者来说更容易使用 - 注意我测试了这些,它们也很好地完成了这项工作。感谢您的帮助/建议。
【解决方案2】:

替代答案,使用 awk:

DATE="10.04.2015 12:00:15"
echo $DATE | awk '{print substr($0,9,2) substr($0,4,2) substr($0,1,2)}'

如果您想稍后进行修改,请进行一些说明:

  • $0 是 substr 操作的输入文本
  • 第一个数字是子字符串的开始位置
  • 第二个数字表示子串的长度

【讨论】:

  • 小心其中包含字符串,如果您的代码在更大的字符串中,则在发生之前需要进行第一次提取。 Mybe 假设要处理的字符串仅包含此信息
【解决方案3】:

您可以使用 bash parameter expansion 提取子字符串

$ date="10.04.2015 12:00:15"
$ newdate=${date:8:2}${date:3:2}${date:0:2}
$ echo $newdate
150410

【讨论】:

  • 看起来是所有替代方案中最好的(如果 shell 是 bash
  • ...输入是一个字符串,而不是一个文件(我认为这里不是这种情况)
  • @hek2mgl,以及 ksh93 和 zsh
  • 谢谢,我确实选择了这个解决方案,输入是一个字符串,我确实使用了 bash,但最终我使用了这个,因为它是最容易看到它是如何工作的。我对 sed/awk 和正则表达式太陌生,无法完全理解所有内容,但参数扩展易于阅读且易于遵循。谢谢,汤姆也谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 2021-07-27
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多