빈 셀을 채우고 탭으로 구분된 파일에서 데이터 유형을 동일하게 만듭니다.

빈 셀을 채우고 탭으로 구분된 파일에서 데이터 유형을 동일하게 만듭니다.

저는 Linux에서 거의 2억 줄에 달하는 탭으로 구분된 파일을 작업하고 있습니다. 이진 값이 포함된 한 열에서 데이터 유형이 일관되지 않고 누락된 값이 많이 있음을 발견했습니다. 예는 다음과 같습니다.

입력하다:

timestamp    val
1589205592   0  
1589205593   0.0
1589205594  
1589205595   1
1589205595   1.0

추천받은거 써봤는데여기awk를 사용하는데 파일 용량이 꽤 커서 속도가 많이 느린 것 같습니다. 값을 0으로 채우고 데이터 유형을 일관되게 만들려고 합니다. 즉, 모든 부동 소수점을 int로 변환하고 현재 파일을 덮어쓰려고 합니다.

산출:

timestamp    val
1589205592   0  
1589205593   0
1589205594   0
1589205595   1
1589205595   1

답변1

awk 'BEGIN { FS=OFS="\t" } NR > 1 { $2 = sprintf("%d", $2) }; 1' file >file.new

그러면 데이터를 읽고 새 파일에 씁니다. 여기서 두 번째 열의 모든 숫자는 정수로 변환됩니다(반내림하면 누락된 데이터가 0이 됩니다).

예를 들어 소수점 이하 두 자리의 부동 소수점 출력을 원하는 경우 호출에서 형식 문자열로 %.2f대신 사용하십시오 .%dsprintf()

출력은 탭으로 구분됩니다.

새 파일을 직접 눈으로 확인한 후 mv기존 파일을 해당 파일로 교체하면 됩니다.

답변2

당신은 시도 할 수 있습니다밀러

mlr --csvlite --fs tab put '$val = is_empty($val) ? 0 : int($val)' file

밀러는로컬 모드당신이 그것을 시도하고 싶다면.

답변3

또는 인라인 sed( -i임시 파일 오버헤드가 있지만 추가하기만 하면 됨)

sed -e "s/\.0$//" -e "s/\t$/\t0/" file

답변4

다음을 수행하세요.

gawk -i inplace -F'\t' 'NR>1{ $2*=1 }1' OFS='\t' infile

그러나 -i inplace그런 마법은 작동하지 않고 대신 임시 파일을 생성한 다음 프로세스가 끝나면 교체합니다. 그래서 당신도 이것을 할 수 있습니다

awk -F'\t' 'NR>1{ $2*=1 }1' OFS='\t' infile > newfile

그런 다음 원본 infile을 삭제하거나 원본 infile을 사용하여 새 파일의 이름을 바꾸십시오.

관련 정보