我有一个大.csv
文件,需要按字符串长度拆分特定列。我正在尝试获取第 2 列的最后 6 个字符并将它们移动到新列中。
当前的:
3102017,90131112,0,740
3022017,8903944,90,0
3092017,127037191,475,0
期望的:
3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0
答案1
具有 POSIX 兼容的awk
:
awk -F, -v OFS=, '{sub(/.{6}$/, OFS "&", $2); print}'
具有 POSIX 兼容的sed
:
sed 's/^\([^,]*,[^,]*\)\([^,]\{6\}\)/\1,\2/'
仅当第二个字段至少有 6 个字符长时,它们才会修改行(请注意,它会很乐意更改111,123456,333
为111,,123456,333
将第二个字段留空)。
答案2
KISS 方法,其中awk
:
$ awk -F, '{l=length($2); if (l>6) {$2=substr($2,1,l-6) OFS substr($2,l-5)}} 1' OFS=, file
3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0
答案3
通过sed
支持扩展正则表达式的实现,假设所有行的第二列中至少有 6 个字符
$ sed -E 's/,([^,]*)([^,]{6}),/,\1,\2,/' ip.csv
3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0
-E
对于扩展正则表达式,某些实现需要-r
改为,([^,]*)([^,]{6}),
将匹配,
第二列并且,
- 第 2 列分为两组,最后 6 个字符位于第 2 组中
,\1,\2,
根据需要更换
答案4
perl -pe 's/(,.*?,)/$1 =~ s!......,!,$&!r /e' x.csv
- 将第二个字段 (
,.*?,
) 替换为 ... =~ s! ...!...!r
最后 6 位数字( ) 替换......
为 ( ) 的结果 和 和 a,