열 내용에 따라 텍스트 파일을 여러 파일로 분할

열 내용에 따라 텍스트 파일을 여러 파일로 분할

다음과 같은 파일이 있습니다.

1 : Aa|xxx Aa|xxx Bb|xxx Cc|xxx Cc|xxx Cc|xxx 
2 : Cc|xxx Aa|xxx Aa|xxx Aa|xxx Bb|xxx    
3 : Bb|xxx Bb|xxx Aa|xxx Cc|xxx    
4 : Bb|xxx Aa|xxx Cc|xxx    
5 : Aa|xxx Cc|xxx Bb|xxx 

이름과 같은 xxx별도의 코드를 나타냅니다 . Aa각 행에는 항상 세 가지 이름이 모두 있습니다.

줄 번호(첫 번째 열)와 이름만 포함된 세 개의 파일이 필요합니다. 이 같은:

1 : Aa|xxx Aa|xxx
2 : Aa|xxx Aa|xxx Aa|xxx
3 : Aa|xxx
4 : Aa|xxx
5 : Aa|xxx

누구든지 이 문제를 해결하도록 도와줄 수 있나요? 나는 매우 기쁠 것이다. 미리 감사드립니다!

답변1

한 가지 가능한 방법은 중복된 콘텐츠를 제거하는 것입니다.

perl -pe 's/ (Bb|Cc)\S*//g' file > A
perl -pe 's/ (Aa|Cc)\S*//g' file > B
perl -pe 's/ (Aa|Bb)\S*//g' file > C

(일부는 sed, awk 등으로 수행할 수 있음)

답변2

sed@JJao가 지적했듯이 확장 정규식( )을 사용하는 것도 쉽습니다 -r.

$ sed -r 's/\s(Cc|Bb)\|...//g' file > A
$ sed -r 's/\s(Aa|Cc)\|...//g' file > B
$ sed -r 's/\s(Aa|Bb)\|...//g' file > C

Os X(Apple 시스템)의 경우 이 옵션은 -rGNU의 경우와 다른 의미를 갖습니다 sed. 특히 \s공백으로 올바르게 해석되지 않습니다. 대신 다음을 사용하세요: [[:space:]].

파이프 뒤의 이름 "xxx"가 항상 3개의 영숫자 문자가 아닌 경우 ...정규 표현식에서 로 바꾸세요 [^[:space:]]+. 일치하는 이름의 차단 지점은 처음으로 만나는 공간이 됩니다.

따라서 보다 일반적인 대답 sed은 출력 파일 A에 대한 것입니다.

$  sed -r 's/[[:space:]](Cc|Bb)\|[^[:space:]]+//g' file > A

관련 정보