다른 레코드와 다른 값을 갖는 일부 레코드가 포함된 대용량 파일이 있습니다.
실제 데이터 파일:
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