乘以或添加更多零

时间:2015-01-09 09:28:31

标签: bash awk

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解决方案?

6 个答案:

答案 0 :(得分:5)

您可以在awk中使用sprintf

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

或者printf之后也可以使用:

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

答案 1 :(得分:1)

这应该有效

awk '{while(length($0)<14)$0=$0 0}1' file

20150101000000
20150101030000
20150101060000
20150101090100
20150101120000
20150101150130
20150101180000
20150101210150

答案 2 :(得分:1)

awk '{i=length($0);while(i++<14)$0=$0"0"}1' File

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

答案 3 :(得分:1)

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

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

这假设file.txt中没有多余的空格。

输出:

20150101000000
20150101030000
20150101060000
20150101090100
20150101120000
20150101150130
20150101180000
20150101210150

答案 4 :(得分:0)

您可以使用for循环:

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

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

所以从数字的长度到14,连接&#34; 0&#34;到&#34;号码&#34;。

答案 5 :(得分:0)

使用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个字符。
  3. 上面的非单行形式的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}).*/\1/' < file