我有一个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