큰 파일이 있고 .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의 결과합으로 대체됩니다.,