다음과 같은 파일이 있습니다.
문서:
900 1 37
900 2 41
900 3 278
918 1 9999
918 2 9999
918 3 9999
다음과 같은 새 파일을 얻고 싶습니다.
918 1 37
918 2 41
918 3 278
이전 숫자 세트(900)에서 마지막 열을 가져와서 다음 숫자 세트(918)의 마지막 열에 사용하고 싶습니다.
바꾸려는 값은 항상 9999입니다. 기본적으로 9999의 모든 값을 마지막 "유효한" 값으로 바꾸고 싶습니다(예: 9999와 다른 값이 있는 경우).
답변1
Perl이 구조하러 옵니다.
perl -lane 'if ($prev == $F[0])
{push @buff, $F[2]}
elsif ($F[2] == 9999)
{print join " ", @F[0,1], shift @buff}
else {$prev = $F[0]; @buff = $F[2]}
' -- file
-n
입력 내용을 한 줄씩 읽고 각 줄의 코드를 실행합니다.-l
입력에서 줄바꿈을 제거하고 출력에 추가합니다.-a
빈 공간의 각 줄을 @F 배열로 분할합니다.@buff
3열과 1열의 마지막 숫자를 기억하기 위해 er를 유지합니다$prev
. 열 1의 숫자가 이전 행과 동일하면 마지막 열을 버퍼에 추가합니다.- 마지막 숫자가 9999이면 처음 두 열의 값을 인쇄하지만 마지막 열의 버퍼를 사용합니다.
- 그렇지 않으면 새 섹션이 시작되었습니다. 버퍼를 다시 초기화하고 $prev를 재설정합니다.
약간 짧은 버전:
perl -lane 'if($F[2]==9999){print join" ",@F[0,1],shift@buff}else{@buff=()if$prev!=$F[0];push@buff,$F[2];$prev=$F[0]}' -- file
답변2
$ awk '$3==9999{$3=p[$2]; print} {p[$2]=$3}' file
918 1 37
918 2 41
918 3 278