Bash에서 문자열로 시작하는 모든 줄을 텍스트 파일의 맨 위로 이동하는 방법

Bash에서 문자열로 시작하는 모든 줄을 텍스트 파일의 맨 위로 이동하는 방법

텍스트 데이터가 포함된 텍스트 파일이 있습니다. XY: 및 OTP XY:에서 시작하는 모든 줄을 파일 맨 위로 이동하고 싶습니다. sed, awk 또는 기타 명령을 사용하여 Bash에서 이 작업을 어떻게 수행합니까?

답변1

GNU 사용 ed(참고: 이는 file내부 수정, 편집된 파일을 stdout으로 출력하려면 wq로 변경 ,p q):

printf '%s\n' 'g/^\(\|OTP \)XY:/m0' wq | ed -s file

답변2

사용 grep:

{ grep -E '^(OTP )?XY:' input_file; grep -E -v '^(OTP )?XY:' input_file; } > ouput_file

이 2개의 grep명령은 input_file( ) 없이 원하는 패턴을 사용하여 -v필터링합니다 .

{ ... } > output_file두 출력을 모두 grep파일에 저장합니다 .

답변3

또 다른 접근 방식은 을 사용하는 것입니다 awk. 예를 들면 다음과 같습니다.

awk -v re='^OTP XY:|^XY:'  'NR==FNR && $0 ~ re; NR!=FNR && $0 !~ re' file file

위의 내용은 단일 프로세스를 사용하며 메모리에 한 줄 이상 저장하지 않고 파일에 두 번 전달합니다(두 번 읽습니다).

두 패턴 중 하나가 파일에서 발생할 가능성이 없는 경우, 즉 RAM에 들어갈 만큼 작은 경우 다음과 같이 사용할 수 있습니다.

awk  '/^OTP XY:|^XY:/{print;next} {a = $0 ORS a};END{printf "%s", a}' file

이 역시 단일 프로세스를 사용합니다. 이번에는 파일에 대한 단일 패스를 생성하지만 파일의 크기/내용에 따라 메모리 사용량이 상당히 증가할 수 있습니다.

관련 정보