输入文件:
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