如何在所有超过 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 位后插入逗号的主要内容,如果未能解决你的问题,请参考以下文章