AWK를 사용하여 마지막 n 문자로 하위 문자열을 새 열로 분할합니다.

AWK를 사용하여 마지막 n 문자로 하위 문자열을 새 열로 분할합니다.

큰 파일이 있고 .csv특정 열을 문자열 길이로 분할해야 합니다. 2열의 마지막 6자를 가져와 새 열로 이동하려고 합니다.

현재의:

3102017,90131112,0,740
3022017,8903944,90,0
3092017,127037191,475,0

예상되는:

3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0

답변1

POSIX 호환 awk:

awk -F, -v OFS=, '{sub(/.{6}$/, OFS "&", $2); print}'

POSIX 호환 sed:

sed 's/^\([^,]*,[^,]*\)\([^,]\{6\}\)/\1,\2/'

두 번째 필드의 길이가 6자 이상인 경우에만 줄을 수정합니다( 두 번째 필드를 비워 두는 111,123456,333것으로 변경된다는 점에 유의하세요 ).111,,123456,333

답변2

KISS 방법은 다음과 같습니다 awk.

$ awk -F, '{l=length($2); if (l>6) {$2=substr($2,1,l-6) OFS substr($2,l-5)}} 1' OFS=, file
3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0

답변3

sed확장 정규식 구현을 지원 함으로써 모든 행의 두 번째 열에는 최소 6자가 있는 것으로 가정됩니다.

$ sed -E 's/,([^,]*)([^,]{6}),/,\1,\2,/' ip.csv 
3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0
  • -E확장 정규식의 경우 일부 구현을 -r다음으로 변경 해야 합니다.
  • ,([^,]*)([^,]{6}),,두 번째 열과 일치하고,
    • 2열은 2개의 그룹으로 나누어지며, 마지막 6자는 그룹 2에 속합니다.
  • ,\1,\2,필요에 따라 교체

답변4

perl -pe 's/(,.*?,)/$1 =~ s!......,!,$&!r /e'  x.csv
  • 두 번째 필드( ,.*?,)를 다음으로 바꿉니다.
  • =~ s! ...!...!r마지막 6자리( )는 ......( )와 a의 결과합으로 대체됩니다.,

관련 정보