簡體   English   中英

如何編輯 Linux 中文本文件中的行 - 將日期格式化為 YYYY-MM-DD,然后按時間段將行格式化為 grep

[英]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 逐行編輯哪種方法時間效率高?

這是使用 awk 更改格式的一種方法:

awk -F'|' '{$3=substr($3,1,4) "-" substr($3,5,2) "-" substr($3,7,2); $4=substr($4,1,4) "-" substr($4,5,2) "-" substr($4,7,2); print}'

鑒於此,它應該可以工作

  • | 僅用於場分離
  • 所有日期都具有相同的格式

您可以將轉換后的行 pipe 轉換為新文件或將其更改到位 當然,您可以對seded執行相同的操作。 我將 go 用於 awk 因為您可以在同一運行中將特定行提取到額外的文件中。

這是一種使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM