입력 파일:
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=$NF","$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
모든 필드를 반복해야 하며, 분할 시 여러 문자열로 분할되는 필드를 찾으면 :
해당 필드 값 앞에 분할 문자열의 첫 번째 부분을 추가해야 합니다.
알고 있다면 항상 두 번째 필드입니다.
$ 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