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=,

ただし、最初の「分割」は区切り文字の左の代わりに右を使用し、最後のコピーは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つの置換のみをしたい場合gs

関連情報