如何在 shell 的日期字段中将零添加到一位数字日期
how to add zero to single digit date in a date field in shell
我有如下数据
1213231421312131|USER|21121|1231412|XEM|NAME|NAME|||5072020|2313||||NY|2131|||99|E|||ver.01
6454242352352352|USER|13131|7342422|XEM|NAME|NAME|||13032001|1231||||TX|7312|||11|E|||ver.01
5131242515111233|USER|21212|2314413|XEM|NAME|NAME|||2101979|1231||||TX|7312|||11|E|||ver.01
2341313412341123|USER|62422|1124242|XEM|NAME|NAME|||23111979|1231||||TX|7312|||11|E|||ver.01
我需要如下数据
1213231421312131|USER|21121|1231412|XEM|NAME|NAME|||05072020|2313||||NY|2131|||99|E|||ver.01
6454242352352352|USER|13131|7342422|XEM|NAME|NAME|||13032001|1231||||TX|7312|||11|E|||ver.01
5131242515111233|USER|21212|2314413|XEM|NAME|NAME|||02101979|1231||||TX|7312|||11|E|||ver.01
2341313412341123|USER|62422|1124242|XEM|NAME|NAME|||23111979|1231||||TX|7312|||11|E|||ver.01
因此提交的 10 是一个日期列,我想将零添加到日期... 7 位到 8 位。我使用了以下命令,但是该命令将管道符号替换为 space.
awk -F "|" '{ = sprintf("%08d", ); print}' <fileName>
请帮我处理这个请求
谢谢
百胜
awk
有一个 input 字段分隔符和一个 output 字段分隔符。 print
命令使用后者。所以要保留 |
符号,也要设置输出字段分隔符 OFS
:
awk -F\| -v OFS=\| '{ = sprintf("%08d", ); print}' yourFile
或者使用来自 GNU coreutils 的 numfmt
(预装在大多数 Linux 系统上)
numfmt -d\| --field 10 --format %08f < yourFile
您可以在 BEGIN 中设置输入 (FS
) 和 输出 (OFS
) 分隔符子句:
awk 'BEGIN{FS=OFS="|"} { = sprintf("%08d", ); print}' <filename>
恕我直言,除了 space.
之外,这是定义相同输入和输出字段分隔符的最便捷方式
查看 online demo:
s='1213231421312131|USER|21121|1231412|XEM|NAME|NAME|||5072020|2313||||NY|2131|||99|E|||ver.01
6454242352352352|USER|13131|7342422|XEM|NAME|NAME|||13032001|1231||||TX|7312|||11|E|||ver.01
5131242515111233|USER|21212|2314413|XEM|NAME|NAME|||2101979|1231||||TX|7312|||11|E|||ver.01
2341313412341123|USER|62422|1124242|XEM|NAME|NAME|||23111979|1231||||TX|7312|||11|E|||ver.01'
awk 'BEGIN{FS=OFS="|"} { = sprintf("%08d", ); print}' <<< "$s"
输出:
1213231421312131|USER|21121|1231412|XEM|NAME|NAME|||05072020|2313||||NY|2131|||99|E|||ver.01
6454242352352352|USER|13131|7342422|XEM|NAME|NAME|||13032001|1231||||TX|7312|||11|E|||ver.01
5131242515111233|USER|21212|2314413|XEM|NAME|NAME|||02101979|1231||||TX|7312|||11|E|||ver.01
2341313412341123|USER|62422|1124242|XEM|NAME|NAME|||23111979|1231||||TX|7312|||11|E|||ver.01
您应该先接受 awk
解决方案,然后才能得到类似
的答案
sed -r 's/(([^|]*\|){9})([^|]{7}\|)//' filename
或更糟
paste -d "|" <(cut -d"|" -f1-9 filename) \
<(cut -d"|" -f10 filename |sed -r 's/^.{7}$/0&/') \
<(cut -d"|" -f11- filename)
我有如下数据
1213231421312131|USER|21121|1231412|XEM|NAME|NAME|||5072020|2313||||NY|2131|||99|E|||ver.01
6454242352352352|USER|13131|7342422|XEM|NAME|NAME|||13032001|1231||||TX|7312|||11|E|||ver.01
5131242515111233|USER|21212|2314413|XEM|NAME|NAME|||2101979|1231||||TX|7312|||11|E|||ver.01
2341313412341123|USER|62422|1124242|XEM|NAME|NAME|||23111979|1231||||TX|7312|||11|E|||ver.01
我需要如下数据
1213231421312131|USER|21121|1231412|XEM|NAME|NAME|||05072020|2313||||NY|2131|||99|E|||ver.01
6454242352352352|USER|13131|7342422|XEM|NAME|NAME|||13032001|1231||||TX|7312|||11|E|||ver.01
5131242515111233|USER|21212|2314413|XEM|NAME|NAME|||02101979|1231||||TX|7312|||11|E|||ver.01
2341313412341123|USER|62422|1124242|XEM|NAME|NAME|||23111979|1231||||TX|7312|||11|E|||ver.01
因此提交的 10 是一个日期列,我想将零添加到日期... 7 位到 8 位。我使用了以下命令,但是该命令将管道符号替换为 space.
awk -F "|" '{ = sprintf("%08d", ); print}' <fileName>
请帮我处理这个请求
谢谢 百胜
awk
有一个 input 字段分隔符和一个 output 字段分隔符。 print
命令使用后者。所以要保留 |
符号,也要设置输出字段分隔符 OFS
:
awk -F\| -v OFS=\| '{ = sprintf("%08d", ); print}' yourFile
或者使用来自 GNU coreutils 的 numfmt
(预装在大多数 Linux 系统上)
numfmt -d\| --field 10 --format %08f < yourFile
您可以在 BEGIN 中设置输入 (FS
) 和 输出 (OFS
) 分隔符子句:
awk 'BEGIN{FS=OFS="|"} { = sprintf("%08d", ); print}' <filename>
恕我直言,除了 space.
之外,这是定义相同输入和输出字段分隔符的最便捷方式查看 online demo:
s='1213231421312131|USER|21121|1231412|XEM|NAME|NAME|||5072020|2313||||NY|2131|||99|E|||ver.01
6454242352352352|USER|13131|7342422|XEM|NAME|NAME|||13032001|1231||||TX|7312|||11|E|||ver.01
5131242515111233|USER|21212|2314413|XEM|NAME|NAME|||2101979|1231||||TX|7312|||11|E|||ver.01
2341313412341123|USER|62422|1124242|XEM|NAME|NAME|||23111979|1231||||TX|7312|||11|E|||ver.01'
awk 'BEGIN{FS=OFS="|"} { = sprintf("%08d", ); print}' <<< "$s"
输出:
1213231421312131|USER|21121|1231412|XEM|NAME|NAME|||05072020|2313||||NY|2131|||99|E|||ver.01
6454242352352352|USER|13131|7342422|XEM|NAME|NAME|||13032001|1231||||TX|7312|||11|E|||ver.01
5131242515111233|USER|21212|2314413|XEM|NAME|NAME|||02101979|1231||||TX|7312|||11|E|||ver.01
2341313412341123|USER|62422|1124242|XEM|NAME|NAME|||23111979|1231||||TX|7312|||11|E|||ver.01
您应该先接受 awk
解决方案,然后才能得到类似
sed -r 's/(([^|]*\|){9})([^|]{7}\|)//' filename
或更糟
paste -d "|" <(cut -d"|" -f1-9 filename) \
<(cut -d"|" -f10 filename |sed -r 's/^.{7}$/0&/') \
<(cut -d"|" -f11- filename)