파일이 많고 입력 파일을 변경하지 않고 특정 줄을 새 파일로 내보내고 싶습니다. 예를 들어, a로 시작하는 모든 줄을 새 파일(a.txt라고 함)로 보내고 다른 모든 줄을 별도의 파일인 bcd.txt로 보내고 싶습니다.
a.......
b.......
c.......
a.......
d.......
현재는 grep '^a' infile.txt > a.txt
첫 번째 부분을 수행한 다음 입력 파일을 복사하고 이를 사용하여 sed -i 's/^a.*$//g
a로 시작하는 줄을 삭제하고 있습니다. 원본 입력 파일을 복제하지 않고 유지하면서 두 작업을 모두 수행할 수 있는 방법이 있습니까?
답변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 제외)에 대해 두 번째 블록을 트리거합니다. next
이 print >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
.