![](/img/trans.png)
[英]Change date format from dd/mm/yyyy to yyyy-mm-dd in a file using shell scripting
[英]How to edit the lines in text file in Linux - format the date to YYYY-MM-DD and then grep the line by time period
任何人都可以使用 bash 腳本或在 Linux 命令行中幫助將此文本文件 (YYYYMMDD) 格式化為日期格式 (YYYY-MM-DD) 文本文件嗎? 我不確定如何開始編輯 23millon 行!!!
我有 YYYYMMDD 格式的文本文件:-
3515034013|50008|20140601|20240730
我想像 YYYY-MM-DD 格式的文本文件一樣編輯(2300 萬行只需要更改第 3 和第 4 個字段):-
3515034013|50008|2014-06-01|2024-07-30
我想從 YYYYMMDD 格式的文本文件轉換為 YYYY-DD-MM 格式,我想根據此文件操作后的時間段從文本文件中獲取特定行,這是最終目標。
最終目標是將第 3 個字段和第 4 個字段格式化為 YYYY-MM-DD,並且還希望 grep 格式化文本文件中的日期行:- 第 03 個字段是開始日期,第 04 個字段是結束日期讓我們說例如,我需要 (01)。 今天之前的結束日期(第 04 個字段),即 2022-08-06 - 所有舊行 (02)。 結束日期(第 04 個字段)是從現在起 2 年,即 2022-08-06th <-> 2024-08-06th 之間的行?
請注意:- 根據日期,有超過 2300 萬行需要編輯和分析。
如何處理這個問題陳述? awk 或 sed 或 Bash 逐行編輯哪種方法時間效率高?
這是一種使用 sed 的方法。 它與steffens 的回答具有相同的限制: |
作為字段分隔符,並且所有日期都具有相同的格式,即月份和日期部分的前導零。
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
是因為在正則表達式中使用了(...)
括號。$ 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
假設只有日期列有 8 個字符,您可以使用 GNU sed
;
$ sed -E 's/\<(....)(..)(..)\>/\1-\2-\3/g' input_file
3515034013|50008|2014-06-01|2024-07-30
這可能對您有用(GNU sed):
sed -E 's/^([^|]*\|[^|]*\|....)(..)(..\|....)(..)/\1-\2-\3-\4-/' file
模式匹配和插入-
在需要的地方。
或者如果文件只有 4 列:
sed -E 's/(..)(..\|....)(..)(..)$/-\1-\2-\3-\4/' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.