특정 날짜보다 최신인 파일의 행 삭제

특정 날짜보다 최신인 파일의 행 삭제

특정 날짜보다 최신 행을 삭제하는 방법을 모르겠습니다. 파일 내용의 일부입니다.

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>하고 위 명령을 파이프로 연결했습니다.

인용하다

https://unix.stackexchange.com/a/11323/47538

https://unix.stackexchange.com/a/83069/47538

답변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/

관련 정보