파일을 분리하기 위해 한 번에 줄을 이동하십시오.

파일을 분리하기 위해 한 번에 줄을 이동하십시오.

파일이 많고 입력 파일을 변경하지 않고 특정 줄을 새 파일로 내보내고 싶습니다. 예를 들어, a로 시작하는 모든 줄을 새 파일(a.txt라고 함)로 보내고 다른 모든 줄을 별도의 파일인 bcd.txt로 보내고 싶습니다.

a.......

b.......

c.......

a.......

d.......

현재는 grep '^a' infile.txt > a.txt첫 번째 부분을 수행한 다음 입력 파일을 복사하고 이를 사용하여 sed -i 's/^a.*$//ga로 시작하는 줄을 삭제하고 있습니다. 원본 입력 파일을 복제하지 않고 유지하면서 두 작업을 모두 수행할 수 있는 방법이 있습니까?

답변1

다음으로 시작하는 모든 줄을 얻으려면 a:

grep '^a' infile.txt >a.txt

"a"로 시작하지 않는 모든 줄을 얻으려면:

grep '^[^a]' infile >bcd.txt   # or grep -v '^a' infile.txt >bcd.txt

이 표현은 [^...]"이 문자 집합에 없는 모든 문자"를 의미하며 문자 집합에는 단일 a.

공동 작업의 경우 다음을 사용하십시오 awk.

awk '/^a/ { print >"a.txt"; next } { print >"bcd.txt" }' infile.txt

프로그램 awk은 an으로 시작하는 모든 라인에 대해 첫 번째 블록을 트리거 a하고 다른 모든 라인( 첫 번째 블록의 명령문으로 a인해 line 제외)에 대해 두 번째 블록을 트리거합니다. nextprint >filename명령문은 현재 행을 주어진 파일에 인쇄합니다.

답변2

a행이 아닌 항목을 로 보내 려면 bcd.txt다음을 반대로 하면 됩니다 grep.

grep    '^a' infile.txt > a.txt
grep -v '^a' infile.txt > bcd.txt

하나의 명령만 사용하는 또 다른 옵션은 awk입니다.

awk '/^a/ { print > "a.txt" } ! /^a/ { print > "bcd.txt" }' < input

약간 재배열하면 다음과 같습니다.

awk '
    /^a/ { print > "a.txt" } 
  ! /^a/ { print > "bcd.txt" }' 
  < input

...로 시작하는 줄은 a첫 번째 블록으로 들어가고 에 기록(추가)되고 a.txt, 다음으로 시작하는 줄은아니요두 번째 블록을 입력하여 시작 a하고 에 쓰기(추가)합니다 bcd.txt.

관련 정보