해당 줄을 찾아 파일 맨 아래에 추가합니다.

해당 줄을 찾아 파일 맨 아래에 추가합니다.

다른 레코드와 다른 값을 갖는 일부 레코드가 포함된 대용량 파일이 있습니다.

실제 데이터 파일:

000000106500000000000129201300000U1E4600000060000+00000020400+00000002532+000000
0000001065000000000001182013000010144700002090000+00000335156+00000006776+000000
0000001065000000000003012014999999999924835390500+07164327872+00447479302+000000
0000001065000000000001102013000004QE8200000150000+00000056450+000000021

$ grep -n "9999999999" BADINS0000001065_000000000020140301.dat

내 파일에 약 100개의 레코드가 있는 경우 이 레코드를 파일 맨 아래에 추가하고 싶습니다. 내 레코드 위치가 파일의 특정 위치에 있는 경우 해당 위치에서 (완전히) 찾아서 삭제해야 합니다. 끝에 추가하려면 파일의 맨 아래(파일의 맨 아래)입니다.

디렉토리에 많은 파일이 있고 실행할 때마다 이 프로세스가 자동으로 실행되기를 원합니다. 파일 이름은 BADINS0000001065_0000000000*이며 항상 동일합니다.

이 목표를 달성하도록 도와주실 수 있나요?

답변1

우리는 함께 awk할 수 있습니다:

awk '
  /PATTERN/ { save = $0 ; next }
  { print }
  END { print save }
' infile > outfile

PATTERN실제 스키마를 대체해야 하며 infile데이터 파일의 이름을 적절하게 바꿔야 합니다.

코드 작동 방식은 다음과 같습니다.

/PATTERN/ { save = $0 ; next }- 패턴이 발견되면 나중을 위해 이 줄을 저장하고 인쇄를 건너뜁니다(따라서 해당 위치에서 삭제).

{ print }- 이전 명령으로 건너뛰지 않은 파일의 해당 행을 인쇄합니다.

END { print save }- 마지막으로 모든 행을 처리한 후 저장된 행, 즉 패턴과 일치하는 행을 추가합니다.


원본 파일을 새 파일로 덮어쓰려면 스크립트 mv뒤에 명령을 추가하세요 awk.

mv outfile infile

다시 적절하게 선택한 파일 이름을 사용하십시오.

답변2

기타 sed 솔루션

sed -i '
        /9999999999/{h;d};           # move match string in hold space
        $G;                          # append string from hold space to end
        s/\n$//                      # avoid empty line if pattern have not met 
       ' BADINS0000001065_0000000000*

답변3

문제가 9999999999항상 존재하는지, 아니면 입력 파일에 이러한 인스턴스가 여러 개 있을 수 있는지는 확실하지 않습니다. 그래서 여기에 sed이러한 모든 상황을 충족하는 버전이 있습니다. 입력 파일의 내부 업데이트는 (옵션 )을
참조하세요 .man sed-i

sed -n '/9999999999/{H;b n}; p; :n; ${g;s/\n//p}' file

관련 정보