awk:分割列,打印分隔符的左侧并粘贴到csv的中间

awk:分割列,打印分隔符的左侧并粘贴到csv的中间

输入文件:

AAA, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH

输出应该是:

AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH

我想到了类似的事情:

awk -F, '{n=split($2,a,":"); a[n]} {$2=$NF","$2}1' OFS=,

但第一个“分割”使用分隔符的右侧而不是左侧,并且末尾的副本复制 HHH 而不是 BBB。

答案1

与单awk

awk -F'[:,]' '{$3=$2":"$3}1' OFS=, infile
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH

答案2

尝试这个:

awk -F, '{n=split($2,a,":"); a[n]} {$2=a[1]","$2}1' OFS=, file
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH

您将最后一个字段和第二个字段分配给 $2 ( $2=$NF","$2),而不是分配第一个字段a与第二个字段 ( $2=a[1]","$2)

答案3

一种简单的非 awk 方法

$ ( cut -f1 -d: file ; cut -f2- -d, file ) | paste -sd,
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH
$

答案4

$ awk -F, -v OFS=, '{ for (i=1; i<=NF; ++i) if (split($i, a, ":") > 1) $i = a[1] OFS $i } 1' file
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH

您将必须迭代所有字段,并且当您发现在拆分时拆分为多个字符串的字段时:,您需要将该拆分字符串的第一部分添加到该字段的值之前。

如果你知道它总是第二个字段:

$ awk -F, -v OFS=, '{ split($2, a, ":"); $2 = a[1] OFS $2 } 1' file
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH

在您的代码中,n将是数据被分割成的字符串数量,因此a[n]将是 中最后一个(最右边):分隔的字符串$2


使用sed

$ sed 's/\([^,: ]*\):/\1, &/g' file
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH

这将替换任何不包含,:或空格的字符串,并且后面紧跟着 a:和它本身两次(第二次包括最后一个:)。

如果您只希望进行一次替换(如您的示例中所示),请删除命令g末尾的。s

相关内容