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

관련 정보