행의 특정 부분 삭제

행의 특정 부분 삭제

다음 형식의 여러 행의 타임스탬프가 포함된 CSV 파일이 있습니다.시: 분: SS: Ms.
예를 들어:

00.00.07.38    
00.00.08.13    
00.00.08.88

이번은 저와 관련이 없어 삭제하고 싶습니다. Bash를 사용하여 파일의 모든 줄에서 HH를 제거하는 방법

파일에서 한 줄씩 읽을 수 있습니다

while IFS=, read col1
do
    #remove HH from every line
    #awk -F '[.]' '{print $1}' <<< $col1 #only prints one portion of time
    #echo $col1 | cut -d"." -f2 | cut -d"." -f3 | cut -d"." -f4
done < $file

나는 놀았 awk지만 cutHH 등의 특정 위치만 인쇄할 수 있습니다.

하지만 새 파일을 만들지 않고 해당 줄의 HH만 제거하려면 어떻게 해야 합니까?

답변1

그냥 사용하십시오 sed:

sed -i.bak 's/[0-9]\{2\}.//' myfile

그러면 마침표가 붙은 두 개의 시작 숫자가 제거되고 파일이 교체되어 원본 파일이 백업( myfile.bak)으로 저장됩니다.

답변2

어쩌면 최선의 해결책은 아니지만 작동합니다

임시 파일을 만들고 나중에 원래 파일 이름으로 이름을 바꿉니다.

function fixTime() {
  file="zipstream_test/timeLog.csv"
  tmpFile="zipstream_test/timeTmp.csv"
  #Remove HH from file, ie remove first 3 chars
  sed 's/^.\{3\}//g' $file > $tmpFile
  rm $file
  mv $tmpFile $file
}

fixTime

답변3

스크립트가 거의 완성되었습니다.

file=filename

while    IFS=. read h m s n
do       echo "$m.$s.$n"
done     < "$file"

IFSdot( )을 사용하면 .read( < "$file")가 입력을 여러 부분으로 분할할 수 있습니다. 이 부분은 h, m, s 및 n에 할당됩니다. 그런 다음 필요한 부분만 인쇄합니다. 실제로 더 간단한 해결책은 다음과 같습니다.

file=filename

while    IFS=. read h m
do       echo "$m"
done     < "$file"

변수 h는 첫 번째 부분을 가져오고 변수 m은 나머지 부분을 가져온 다음 인쇄합니다.

답변4

~부터태그 중 하나입니다.

$ cut -d . -f 2- file
00.07.38
00.08.13
00.08.88

cut이렇게 하면 위협 파일이 점으로 구분된 필드 집합이 됩니다 . 각 행에 대해 필드 2부터 시작하는 모든 필드를 추출합니다.

관련 정보