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

  • 本文关键字:数字 4位 插入 8位 bash csv sed
  • 更新时间 :
  • 英文 :


我有一个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位数字。

我也愿意接受任何可能存在的更优雅的方式来解决这个问题。

谢谢

尝试此sed

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

因为已经提到了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 '%sn' "${line[*]}"
done
) < some_file.csv

相关内容

  • 没有找到相关文章

最新更新