다음 형식의 여러 행의 타임스탬프가 포함된 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
지만 cut
HH 등의 특정 위치만 인쇄할 수 있습니다.
하지만 새 파일을 만들지 않고 해당 줄의 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"
IFS
dot( )을 사용하면 .
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부터 시작하는 모든 필드를 추출합니다.