테이블에 행 추가

테이블에 행 추가

까지 table.txt의 시계열이 포함된 일반 텍스트 테이블( )이 여러 개 있습니다 . 불행하게도 그 중 일부는 다음과 같이 시계열의 마지막 날이 누락되었습니다 .2005209931.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개가 오는 새로운 줄을 모든 파일에 추가합니다 .30RES2099 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)

관련 정보