如何使用awk将数据文件中的数字列表转换为日期格式

the*_*per 1 awk date

第二列是日期,我希望它打印为 DD.MM.YYYY。请注意,第 4 行有点不同。

89  150716  -50,00
101 170816  -50,00
123 141016  -100,00
142 91216   -100,00
19  140217  -100,00
38  230317  -50,00
50  200417  -50,00
65  260517  -50,00
77  190617  -50,00
95  200717  -50,00
106 150817  -50,00
120 150917  -50,00
164 171117  -100,00
10  150118  -100,00
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 5

awk '{ s = sprintf("%06d", $2); d = substr(s,1,2); m = substr(s,3,2); y = "20" substr(s,5,2); printf("%s%s%s.%s.%s%s%s%s", $1, OFS, m, d, y, OFS, $3, ORS) }' file.in
89 07.15.2016 -50,00
101 08.17.2016 -50,00
123 10.14.2016 -100,00
142 12.09.2016 -100,00
19 02.14.2017 -100,00
38 03.23.2017 -50,00
50 04.20.2017 -50,00
65 05.26.2017 -50,00
77 06.19.2017 -50,00
95 07.20.2017 -50,00
106 08.15.2017 -50,00
120 09.15.2017 -50,00
164 11.17.2017 -100,00
10 01.15.2018 -100,00
Run Code Online (Sandbox Code Playgroud)

所述awk在一个更好的形式的代码:

{
    s = sprintf("%06d", $2)

    d = substr(s,1,2)
    m = substr(s,3,2)
    y = "20" substr(s,5,2)

    printf("%s%s%s.%s.%s%s%s%s", $1, OFS, m, d, y, OFS, $3, ORS)
}
Run Code Online (Sandbox Code Playgroud)

s首先设置为第二个输入字段的填充零的六位数形式。d, mand y(day, month and year) 然后从这个字符串中提取出来,并20作为前缀添加到年份部分。

printf随后打印出所产生的记录。 OFS是当前输出字段分隔符(通常是空格),并且ORS输出记录分隔符(通常是换行符)。

要获得制表符分隔的输出:

awk -vOFS='\t' '{ ...as above... }' file.in
Run Code Online (Sandbox Code Playgroud)