乘以或添加更多的零
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
附加到每一行。
这是一种使用 coreutils
和 bash
重定向的有趣方法:
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
解释:
- 对于输入的每一行,附加 14 个零。
- 在生成的行中,打印前 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
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
附加到每一行。
这是一种使用 coreutils
和 bash
重定向的有趣方法:
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
解释:
- 对于输入的每一行,附加 14 个零。
- 在生成的行中,打印前 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