특정 열에서 단어(문자 뒤에 공백) 제거

특정 열에서 단어(문자 뒤에 공백) 제거

다음 형식의 파일이 있습니다.

cat dog AHF123432 | 123432 | dhfshfjdh
lion  AFG23412 |23412 | dfshjhfjdhj

첫 번째 열에서 문자만 포함된 단어(예: 첫 번째 행의 고양이(뒤에 공백) 및 개, 두 번째 행의 사자)를 제거해야 합니다.

내 결과는 다음과 유사합니다.

AHF123432 | 123432 |  dhfshfjdh    
AFG23412 | 23412 | dhfshfjdh

답변1

그러면 줄 시작 부분의 모든 알파벳 단어가 제거됩니다.

$ sed -r 's/^([[:alpha:]]* )*//' filename.tsv
AHF123432 | 123432 | dhfshfjdh
AFG23412 |23412 | dfshjhfjdhj

또는 출력을 새 파일에 저장합니다.

sed -r 's/^([[:alpha:]]* )*//' filename.tsv > final.tsv

어떻게 작동하나요?

  • [[:alpha:]]*공백이 뒤따르는 임의의 수의 알파벳 문자와 일치합니다. 즉, 단어 뒤에 공백이 오는 것과 일치합니다.

    더 자세히 말하면 [[:alpha:]]단일 알파벳 문자와 일치합니다. ``[[:alpha:]]*`는 이러한 문자의 개수와 일치합니다.

  • ([[:alpha:]]* )*공백이 뒤따르는 이러한 단어의 수와 일치합니다.

  • ^([[:alpha:]]* )*공백이 뒤따르는 임의의 수의 단어와 일치하지만 ^줄의 시작 부분에서만 시작됩니다.

  • 바꾸기 명령은 일치하는 모든 단어를 제거합니다. 바꾸기 명령의 형식 s/old/new/은 다음과 같습니다. old위의 표현식은 줄의 시작 부분부터 시작하여 임의의 수의 단어와 일치합니다. 우리는 이 단어들을 빈 문자열로 바꾸고 싶기 때문에 여기서는 빈 문자열을 사용합니다 new.

과거에는 알파벳 문자 일치를 위한 정규식은 이었습니다 [a-zA-Z]. 최신 유니코드 글꼴에서는 이것이 더 안정적입니다. 위에서 사용한 정규식은 [:alpha:]유니코드에 안전하기 때문입니다.

답변2

erl 호환 정규식 을 grep지원 하는 경우 :pcre

grep -Po '^([a-z]* +)*\K.*'

또는

pcregrep -o '^([a-z]* +)*\K.*'

답변3

사용awk

awk -F'|' '{for (i=1; i<=NF;i++) {gsub(/([a-z]|[A-Z])+ /,"",$i); printf "%s",$i; if(i<NF) {printf "|"} else { printf "\n"}}}' foo

% cat foo
cat dog AHF123432 | 123432 | dhfshfjdh
lion AFG23412 | 23412 | dfshjhfjdh

% awk -F'|' '{for (i=1; i<=NF;i++) {gsub(/([a-z]|[A-Z])+ /,"",$i); printf "%s",$i; if(i<NF) {printf "|"} else { printf "\n"}}}' foo
AHF123432 | 123432 | dhfshfjdh
AFG23412 | 23412 | dfshjhfjdh

관련 정보