특정 필드의 숫자에 소수 구분 기호를 추가하는 방법

특정 필드의 숫자에 소수 구분 기호를 추가하는 방법

.txt 파일이 있는데 가독성을 높이기 위해 소수 구분 기호로 쉼표를 추가해야 합니다. 이 긴 숫자는 특정 열에만 존재하며 이를 수행할 방법을 찾을 수 없습니다. 열은 세미콜론으로 구분되며 모든 문자를 포함할 수 있습니다. awk에서 if 문을 사용하여 열의 길이가 3보다 큰지 확인하려고 했지만 세 숫자마다 쉼표를 넣는 방법을 찾을 수 없었습니다. 숫자는 세 번째와 네 번째 열에 있습니다.

이것

BitstreamCyberCJK;Freeware;30275;28686;v2.0 beta (1998-03-17);Cyberbit.ttf (12.4 MB);Bitstream CyberCJK;Medium (Normal), Book, Roman;TTF;Cove

Y.OzFontN;Freeware;21957;57621;v13.00 sfnt rev 5 Pen-Ji (2010-08-24);YOzRN.TTC (13.5 MB);YOzFontN;Regular;TTC;Any

다음과 같아야 합니다.

BitstreamCyberCJK;Freeware;30,275;28,686;v2.0 beta (1998-03-17);Cyberbit.ttf (12.4 MB);Bitstream CyberCJK;Medium (Normal), Book, Roman;TTF;Cove

Y.OzFontN;Freeware;21,957;57,621;v13.00 sfnt rev 5 Pen-Ji (2010-08-24);YOzRN.TTC (13.5 MB);YOzFontN;Regular;TTC;Any

답변1

GNU Coreutils를 사용 numfmt하고 로케일이 이러한 그룹화를 지원하는 경우 다음을 사용할 수 있습니다.

numfmt -d ';' --field=- --grouping --invalid='ignore' < file

전임자.

$ numfmt -d ';' --field=- --grouping --invalid='ignore' < file
BitstreamCyberCJK;Freeware;30,275;28,686;v2.0 beta (1998-03-17);Cyberbit.ttf (12.4 MB);Bitstream CyberCJK;Medium (Normal), Book, Roman;TTF;Cove

Y.OzFontN;Freeware;21,957;57,621;v13.00 sfnt rev 5 Pen-Ji (2010-08-24);YOzRN.TTC (13.5 MB);YOzFontN;Regular;TTC;Any

어떤 필드에 숫자 필드가 포함되어 있는지 알고 있는 경우 해당 필드를 명시적으로 지정하고 처리를 생략할 수 있습니다 --invalid.

numfmt -d ';' --field=3,4 --grouping < file

%'GNU awk가 있는 경우 형식 수정자를 사용하여 다음과 같은 작업을 수행할 수 있습니다 sprintf.

gawk '
  BEGIN {OFS=FS=";"} 
  {for(i=1;i<NF;i++) {if($i ~ /^[0-9]+$/) $i = sprintf("%'\''d", $i)}} 
  1
' file

관련 정보