如何在所有超过 8 位的号码的 4 位后插入逗号

Posted

技术标签:

【中文标题】如何在所有超过 8 位的号码的 4 位后插入逗号【英文标题】:How to insert a comma after 4 digits for all number with more than 8 digits 【发布时间】:2021-10-30 06:27:56 【问题描述】:

我的 csv 文件如下所示:

12625,6475,387,-388,-332,-217,-104,17,125,160,121,38,-101,-282,-368
-2675,6475,420,-385,-330,-217,-106,16,124,158,120,37,-104,-281,-365
2725,6475,633,-377,-327,-222,-117,6,113,148,109,26,-114,-282,-359
-12775,6475,927,-367,-324,-229,-133,-9,99,134,95,11,-128,-283,-351
12825,64751200,-357,-320,-236,-147,-23,86,121,82,-3,-140,-283,-344
          ^ missing comma

在某些行中,示例的最后一行显示了问题,其中第二列和第三列之间缺少逗号。我从数据中知道,合法条目最多可以有 5 个数字(在某些情况下,前面有一个 -),所有有 8 个数字的条目都来自缺少的逗号,逗号应该出现在第四个数字之后。

我正在查看一个表达式 - 大概是 sed - 在文件中所有 8 位数字的第四位数字之后插入一个逗号。

到目前为止我所拥有的是

echo "12356" | sed 's/\B[0-9]\3\/&,/g'

这将在四位数字后插入一个逗号。如何过滤以使这种情况仅发生在 8 位数字上,而不是 5 位数字上。

我也愿意采用任何更优雅的方式来解决该问题。

谢谢

【问题讨论】:

与尝试检测损坏的数据并直觉其正确形式相比,修复生成损坏数据的原因难道不是更可取的吗? 我一般会同意,但在这种情况下,我是这样得到的,并且无法控制它是如何生成的。 【参考方案1】:

试试这个sed

sed -E 's/([0-9]4)([0-9]4)/\1,\2/g'

【讨论】:

sed -E 's/([0-9]4)([0-9]4)/\1,\2/' 考虑添加一个尾随g(即sed 's/..../\1,\2/g),以防一行中有多个8位数字实例 也许使用sed -r 来减少反斜杠的混乱。 工作完美,非常容易适应其他情况,谢谢【参考方案2】:

因为sed已经被提及,这里有一些awk...

awk -F, -vOFS=, '
  for (i = 1; i <= NF; ++i)
    if (length($i) >= 8)
      $i = substr($i, 1, 4) "," substr($i, 5)
 1' < some_file.csv

...这里有一些纯粹的 Bash,没有任何理由:

(
IFS=,
while read -ra line; do
  for i in "$!line[@]"; do
    (($#line[i] >= 8)) && line[i]="$line[i]::4,$line[i]:4"
  done
  printf '%s\n' "$line[*]"
done
) < some_file.csv

【讨论】:

诚然,我上面的示例都没有处理 >8 位的情况(通过插入更多逗号),但考虑到 CSV 的问题和结构,我假设解决方案不是应该是那个通用的。

以上是关于如何在所有超过 8 位的号码的 4 位后插入逗号的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中将小数点后的逗号和零值添加到千位后的数字字符串中

在EXCEL表格中输入身份证号的时候为啥总是显示科学记数法

用千位后的逗号分离重构复杂因子向量

测试身份证号码

Freemarker数值问题

18位身份证号码结构的系数算法