如何在 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)