저는 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
대신 사용하십시오 .%d
sprintf()
출력은 탭으로 구분됩니다.
새 파일을 직접 눈으로 확인한 후 mv
기존 파일을 해당 파일로 교체하면 됩니다.
답변2
답변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을 사용하여 새 파일의 이름을 바꾸십시오.