使用 AWK 将子字符串按最后 n 个字符拆分到新列中

使用 AWK 将子字符串按最后 n 个字符拆分到新列中

我有一个大.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,333111,,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,

相关内容