예를 들어 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}는
pat
in을in
아무것도 아닌 것으로 대체합니다.$
첫 번째 변수/부분(in)과 비교하여 pat var를 변수로 표시해야 합니다.