awk를 사용하여 고유한 문자만 남기고 다른 텍스트 문자열에서 하나의 텍스트 문자열을 뺍니다.

awk를 사용하여 고유한 문자만 남기고 다른 텍스트 문자열에서 하나의 텍스트 문자열을 뺍니다.

예를 들어 awk를 사용하는 것처럼 텍스트가 포함된 다른 열에서 텍스트가 포함된 데이터 열을 빼고 고유 문자가 포함된 세 번째 열을 얻는 방법이 있습니까?

입력하다

ab   a
cd   d    
efg  ef

원하는 출력:

ab   a   b
cd   d   c
efg  ef  g

답변1

예, awk적합한 선택입니다.

awk 'NF{t=$1;gsub("["$2"]","",t);print$0,t}' input

두 번째 필드에 정규식 문자 클래스의 특별한 의미가 있는 문자가 포함될 수 있는 경우 해당 문자를 이스케이프해야 합니다. POSIX에서 이 문제를 해결하는 데 awk시간이 걸리므로 GNU 대안을 게시하겠습니다 awk.

gawk 'NF{print$0,gensub("["gensub(/([\[\]^-])/,"\\\\\\1","g",$2)"]","","g",$1)}' input

답변2

Manatworks의 솔루션은 확실히 문제가 되지 않습니다. 이것은 단지 순수한 bash 대안입니다.

while read line
do
  in=${line/ */}
  pat=${line/* /}
  echo $line ${in/$pat}
done < aba.dat

ab a b
cd d c
efg ef g
  • in$line의 교체( ) 에서 /공백 뒤에는 정규 표현식이 아니라 와일드카드 스타일이 따라옵니다.
  • 반대 pat: 공백 앞의 내용을 제거합니다. ${src/pattern/replacement}의 대체 부분이 비어 있으므로 삭제합니다.
  • ${in/$pat}는 patin을 in아무것도 아닌 것으로 대체합니다. $첫 번째 변수/부분(in)과 비교하여 pat var를 변수로 표시해야 합니다.

관련 정보