乘以或添加更多的零

Multiply or add more zeroes

cat file.txt

20150101
2015010103
2015010106
201501010901
2015010112
20150101150130
2015010118
20150101210150

文件包含 YYYYMMDDHHMMSS 格式的日期。它的长度在某处是 8、10、12、14。 我希望输出为

20150101000000
20150101030000
20150101060000
20150101090100
20150101120000
20150101150130
20150101180000
20150101210150

缺少 HHMMSS 的地方,输入 000000。
我正在尝试逐行读取数组中的整个文件,如:

mapfile -s 0 -t strdate < file.txt
for pp in ${strdate[@]};do
  if [ `echo ${#pp}` == 8 ]; then
  newTime=$(( $pp*10000 ))
  ...
  fi
done

任何直接的 awk 解决方案?

您可以使用 for 循环:

~$ awk '{x=[=10=];for(i=length(x);i<14;i++)x=x"0";print x}' file.txt
20150101000000
20150101030000
20150101060000
20150101090100
20150101120000
20150101150130
20150101180000
20150101210150

length(string) 给出字符串中的字符数。如果字符串是一个数字,它给出代表该数字的字符串的长度。

所以从数字的长度到14,将“0”连接到"number"。

您可以在 awk 中使用 sprintf

awk '{s=sprintf("%-14s", ); gsub(/ /, "0", s); print s}' file
20150101000000
20150101030000
20150101060000
20150101090100
20150101120000
20150101150130
20150101180000
20150101210150

或者遵循 printf 也可以:

awk '{printf "%-d%0" (14-length()) "s\n", , ""}' file
20150101000000
20150101030000
20150101060000
20150101090100
20150101120000
20150101150130
20150101180000
20150101210150

这应该有效

awk '{while(length([=10=])<14)[=10=]=[=10=] 0}1' file

20150101000000
20150101030000
20150101060000
20150101090100
20150101120000
20150101150130
20150101180000
20150101210150
awk '{i=length([=10=]);while(i++<14)[=10=]=[=10=]"0"}1' File

逻辑: 只要行长度小于 14 (as per question) 并打印每一行,就将 0 附加到每一行。

这是一种使用 coreutilsbash 重定向的有趣方法:

printf "%-14s\n" $(<file.txt) | tr ' ' 0

这假设file.txt中没有额外的space。

输出:

20150101000000
20150101030000
20150101060000
20150101090100
20150101120000
20150101150130
20150101180000
20150101210150

使用Python:

$ cat file
20150101
2015010103
2015010106
201501010901
2015010112
20150101150130
2015010118
20150101210150

$ python -c $'import sys\nfor line in sys.stdin:\n\tprint "%.14s" % (line.rstrip() + "0"*14)' < file
20150101000000
20150101030000
20150101060000
20150101090100
20150101120000
20150101150130
20150101180000
20150101210150

解释:

  1. 对于输入的每一行,附加 14 个零。
  2. 在生成的行中,打印前 14 个字符。

上面的非单行形式的 python 脚本如下所示:

#!/usr/bin/env python
import sys
for line in sys.stdin:
    print "%.14s" % (line.rstrip() + "0"*14)

sed下的逻辑相同:

sed -r  's/$/00000000000000/;s/(.{14}).*//' < file