다음과 같은 파일이 있습니다.
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 시스템)의 경우 이 옵션은 -r
GNU의 경우와 다른 의미를 갖습니다 sed
. 특히 \s
공백으로 올바르게 해석되지 않습니다. 대신 다음을 사용하세요: [[:space:]]
.
파이프 뒤의 이름 "xxx"가 항상 3개의 영숫자 문자가 아닌 경우 ...
정규 표현식에서 로 바꾸세요 [^[:space:]]+
. 일치하는 이름의 차단 지점은 처음으로 만나는 공간이 됩니다.
따라서 보다 일반적인 대답 sed
은 출력 파일 A에 대한 것입니다.
$ sed -r 's/[[:space:]](Cc|Bb)\|[^[:space:]]+//g' file > A