특정 날짜보다 최신 행을 삭제하는 방법을 모르겠습니다. 파일 내용의 일부입니다.
save.txt 빌드
647919 2013/11/30
647946 2013/11/30
647955 2013/12/01
648266 2013/12/03
648267 2013/12/03
648674 2013/12/04
2013/12/03 이후의 행을 삭제하고 2013년 12월 3일 이후의 행만 남기고 싶습니다.
647919 2013/11/30
647946 2013/11/30
647955 2013/12/01
Bash를 통해 이 작업을 어떻게 수행할 수 있나요?
답변1
이 날짜는 사전식 및 연대순으로 동일한 방식으로 정렬되므로 어휘 비교를 수행하십시오.
awk '$2 < "2013/12/03"'
답변2
시스템에 이 명령의 GNU 버전이 포함되어 있는 경우 date
이를 사용하여 날짜 필드(있는 경우 tail 제거 후 <br>
)를 Seconds-Since-epoch로 변환하고 동일한 형식(예: bash)의 최종 기한과 직접 비교할 수 있습니다.
testsecs=$(date +%s --date="2013/12/03")
while IFS= read -r line; do
read -r x d <<< "$line"
if (( $(date +%s --date="${d%<br>}") < $testsecs )); then
printf '%s\n' "$line"
fi
done < buildsave.txt
[이것은 내부 삭제를 수행하지 않는다는 점에 유의하십시오. 결과를 임시 파일에 저장하고 이름을 바꿔야 합니다. ]
답변3
<br>
칼럼 마지막 질문에 말씀하신 내용은 필요 하지 않다고 생각합니다 date
. 어쨌든 존재한다면 쉽게 제거할 수 있습니다. 그러나 주요 부분으로 이동하면 다음을 사용하여 원하는 작업을 달성할 수 있습니다.
sort -k 2n filename.txt
이제 위 명령은 정렬된 방식으로 출력을 제공합니다. 이제 다음 명령을 실행하면 원하는 내용을 얻을 수 있습니다.
sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}'
설명하다
sort 명령은 기본적으로 날짜인 두 번째 열을 기준으로 파일을 정렬합니다. 입력 파일은 기본적으로 모든 데이터를 정렬하므로 명령이 작동하는지 테스트하기 위해 입력 파일을 수정했습니다. 그 후, awk
명령은 특정 일치 항목이 발견될 때까지 모든 행을 인쇄합니다.
시험
cat filename.txt
647919 2014/01/01
647946 2012/11/30
647955 2011/01/04
648266 2013/12/03
648267 2013/12/03
648674 2013/12/04
이제 sort -k 2n filename.txt
출력은 다음과 같습니다.
647955 2011/01/04
647946 2012/11/30
648266 2013/12/03
648267 2013/12/03
648674 2013/12/04
647919 2014/01/01
이제 파일이 두 번째 열에 정렬된 것에 만족합니다. 이제 값을 선택하세요.에 따라특정 날짜,
sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}'
위의 예에서는 모든 값을 얻었습니다 2013/12/03
. 출력은,
647955 2011/01/04
647946 2012/11/30
아니요, 이것은 <br>
내 파일의 일부입니다.
이 경우 아래와 같이 명령을 약간 조정할 수 있습니다.
awk '{print $1, substr($2, 1, length($2)-4)}' filename.txt |
sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}'
그래서 두 번째 열에서 모든 레이블을 제거 <br>
하고 위 명령을 파이프로 연결했습니다.
인용하다
답변4
귀하가 제공한 날짜에 대한 빠르고 더러운 해결책은 sed를 사용하여 그 이후의 날짜와 일치하는 모든 줄을 삭제하는 것입니다.
sed -i "" "#[0-9]* 2013/12/0[4-9]#d" testfile.txt
sed -i "" "#[0-9]* 2013/12/[123][0-9]#d" testfile.txt
sed -i "" "#[0-9]* 2014/[0-9][0-9]/[0-3][0-9]#d" testfile.txt
-i ""는 백업을 생성하지 않고 파일 내부를 직접 대체하지만 -i ""를 사용하지 않고 3개의 sed 명령을 모두 통해 testfile을 파이프할 수도 있습니다.
시스템(Linux 또는 Mac)에 따라 -i 뒤에 ""를 생략할 수 있으며, 때로는 정규식의 -e 매개변수가 필요할 수도 있습니다. 자신에게 맞는 것을 시도해 보십시오.
sed에 대한 추가 정보가 포함된 관련 질문:https://stackoverflow.com/questions/5410757/