有人能帮助使用bash脚本或Linux命令行将此文本文件(YYYYMMDD)格式化为日期格式(YYYYMMDD DD)文本文件吗?我不知道如何开始编辑2300万行!
我有YYYYMMDD格式文本文件:-
3515034013|50008|20140601|20240730而且我想编辑类似于YYYY DD格式的文本文件(只需要修改第3和第4个字段就可以修改2300万行):-
3515034013|50008|2014-06-01|2024-07-30我想要从YYYYMMDD格式的文本文件转换为YYYYMMDD MM格式,并且我希望根据这个文件操作后的时间,从文本文件中获得特定的行,这是最终目标。
最终目标是将第三个字段和第四个字段格式化为YYYY DD,并希望grep按日期从格式化的文本文件中按日期排列:-03字段是开始日期,第04字段是结束日期,例如,我需要(01)。今天之前的结束日期(第04字段),即2022-08-06 -所有旧行(02)。结束日期(第04字段)从现在起2年,即在2022-08-06 <-> 2024-08-06之间的线?
请注意:-有超过2300万行编辑和分析的基础上的日期。
如何处理这个问题陈述?哪种方法是时间高效的awk或sed或Bash逐行编辑?
发布于 2022-08-06 11:28:14
$ awk '
BEGIN { FS=OFS="|" }
{
for ( i=3; i<=4; i++ ) {
$i = substr($i,1,4) "-" substr($i,5,2) "-" substr($i,7)
}
print
}
' file
3515034013|50008|2014-06-01|2024-07-30发布于 2022-08-06 10:37:57
发布于 2022-08-06 11:15:05
这里有一种使用sed的方法。它与斯蒂芬斯的回答:|作为字段分隔符具有相同的限制,并且所有日期都具有相同的格式,即月份和日期部分中的前导零。
sed -E 's/^(.*[|])([0-9]{4})([0-9]{2})([0-9]{2})[|]([0-9]{4})([0-9]{2})([0-9]{2})$/\1\2-\3-\4|\5-\6-\7/g'以下是正则表达式的作用:
^(.*[|])将字符串的第一部分从linestart (^)捕获到|到\1,这将捕获前两列,因为re的其余部分与行的其余部分匹配,直到lineend!([0-9]{4})([0-9]{2})([0-9]{2})[|]将第一个日期字段部分捕获到\2到\4中,注意[|]([0-9]{4})([0-9]{2})([0-9]{2})$对锚定在lineend ($)的第二个日期列也是这样,并将部分捕获到\5到\7中,注意$\1\2-\3-\4|\5-\6-\7在不同的位置插入-\n是因为正则表达式中使用了(...) parens。https://stackoverflow.com/questions/73258912
复制相似问题