入力ファイル:
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=,
ただし、最初の「分割」は区切り文字の左の代わりに右を使用し、最後のコピーはBBBの代わりにHHHをコピーします。
答え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
割り当てるのではなく、最後のフィールドと2番目のフィールドを$ 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
すべてのフィールドを繰り返す必要があり、分割時に複数の文字列に分割されるフィールドを見つけると、そのフィールド値の:
前に分割文字列の最初の部分を追加する必要があります。
知っていれば、常に2番目のフィールドです。
$ 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:
とそれ自体が2回(最後のエントリを含む2番目)になる文字列を置き換えます:
。
あなたの例のように、1つの置換のみをしたい場合g
。s