까지 table.txt
의 시계열이 포함된 일반 텍스트 테이블( )이 여러 개 있습니다 . 불행하게도 그 중 일부는 다음과 같이 시계열의 마지막 날이 누락되었습니다 .2005
2099
31.12.2099
YEAR MONTH DAY RES
2005 1 1 1000
2005 1 2 1001
[...]
2099 12 29 1002
2099 12 30 1003
전날 값( )을 붙여넣어 31.12.2099
시계열( )에 누락된 날짜를 추가하는 방법은 무엇입니까? RES
제공된 최소 예제를 고려하면 출력은 다음과 같아야 합니다.
YEAR MONTH DAY RES
2005 1 1 1000
2005 1 2 1001
[...]
2099 12 29 1002
2099 12 30 1003
2099 12 31 1003
답변1
그리고 awk
:
awk '{a=$0}1; END{$0=a; if($1==2099&&$2==12&&$3==30){$3=31;print}}' file | column -t
r=$0
변수를a
전체 행으로 설정합니다.1
모든 행의 실제 조건을 인쇄합니다.END{...}
모든 행이 처리된 후 이 블록을 실행합니다.$1==2099&&$2==12&&$3==30
마지막 줄이 2099년 12월 30일인 경우(13번째 줄이 누락됨)$3=31
날짜를 다음으로 설정하세요.31
print
추가 줄을 인쇄하십시오.
column -t
목록을 정리하는 것입니다.
입력 파일의 결과:
YEAR MONTH DAY RES
2005 1 1 1000
2005 1 2 1001
...
2099 12 29 1002
2099 12 30 1003
2099 12 31 1003
답변2
table
이 스크립트는 마지막 줄 뒤에 공백 2개와 기호 4개가 오는 새로운 줄을 모든 파일에 추가합니다 .30
RES
2099 12 31 RES(from line before)
sed -i '$ s/30\( ....\)$/&\n2099 12 31\1/' table*
답변3
파일 이름이 모두 시작한다고 가정하면 table
(그렇지 않은 경우 glob 패턴을 모든 파일 이름과 일치하는 것으로 변경하면 됩니다) 다음을 수행할 수 있습니다.
for file in table*; do
awk -vi="2099 12 31" '1;END{if($0!=i){print i,$NF}}' "$file" > "$file".new
done
이 awk
명령은 변수를 i
누락된 행으로 정의합니다. 1;
각 줄을 인쇄하고 전체 END{}
파일을 읽은 후 블록을 실행하면 됩니다. END{}
블록 내에서 $0
읽혀지는 마지막 줄, 즉 파일의 마지막 줄이 됩니다. 값과 같지 않으면 파일 마지막 줄의 마지막 필드를 i
인쇄합니다 .i
(NF)