awk를 사용하여 밑줄 문자를 제거하는 방법

awk를 사용하여 밑줄 문자를 제거하는 방법

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

This is an _PLUTO_
This is _PINEAPPLE_
This is _ORANGE_
This is _RICE_

다음 코드를 사용하여 출력을 추출합니다.

awk '{ print "Country: "  $NF }'  report.txt   

산출:

Country: _PLUTO_
Country: _PINEAPPLE_
Country: _ORANGE_
Country: _RICE_

내 출력이 다음과 같이 보이도록 모든 밑줄을 제거하려면 어떻게 해야 합니까?

Country: PLUTO
Country: PINEAPPLE
Country: ORANGE
Country: RICE

답변1

다음 스니펫을 사용할 수 있습니다.

$ awk '{ gsub("_", "", $NF); print "Country: " $NF }' report.txt
Country: PLUTO
Country: PINEAPPLE
Country: ORANGE
Country: RICE

수정은 내부에서 수행되므로 귀하의 경우 gsub()교체 결과가 다시 저장됩니다.$NF

gensub()GNU awk를 사용하는 경우 약간 더 간단한 this 를 사용할 수 있습니다 .

$ gawk '{ print "Country: " gensub("_", "", "g", $NF) }' report.txt
Country: PLUTO
Country: PINEAPPLE
Country: ORANGE
Country: RICE

GNU awk 문서를 참조하세요.gsub()그리고젠섭()자세한 내용은.

답변2

노력하다

awk -F_ '{ print "Country: " $(NF-1) }' infile

시도해 볼 수 있습니다 sed.

sed -r 's/[^_]*_([^_]*)_.*/Country: \1/' infile
  • [^_]*_처음 _보일 때까지 모든 것을 일치시킵니다.
  • ([^_]*)_위 일치 항목 이후 다음에 _표시될 때까지 모든 항목을 일치시키고 .*그 이후의 모든 항목과 일치하지만 (...)일부만 캡처된 그룹으로 유지합니다.
  • \1~이다역참조([^_]*)캡처된 그룹 에

답변3

대신 사용하십시오 sed:

$ sed -E 's/^This is (an? )?/Country: /; s/\<_//; s/_\>//' file
Country: PLUTO
Country: PINEAPPLE
Country: ORANGE
Country: RICE

이는 세 가지 대체에 적용됩니다.

  1. This is뒤에 오는 텍스트를 a또는 an로 바꿉니다 Country:.
  2. _단어의 시작 부분을 삭제합니다 .
  3. _단어 끝에서 삭제합니다.

마지막 두 교체는 테이블의 데이터를 허용합니다.

This is a _big_blue_ball_

이는 다음으로 변환됩니다.

Country: big_blue_ball

설마

Country: big blue ball

또 다른 awk접근 방식은 각 줄의 첫 번째 부분을 무시하고 공백으로 구분된 마지막 필드의 첫 번째와 마지막 문자를 자르는 것입니다.

awk '{ printf("Country: %s\n", substr($NF, 2, length($NF)-2)) }'

답변4

파이썬을 사용하여 완료

#!/usr/bin/python
import re
l=[]
k=open('file.txt','r')
for i in k:
        l.append(i)
m=re.compile(r'_.*')
for h in l:
        out=re.search(m,h)
        print "Country:",out.group().split('_')[-2]

산출

Country: PLUTO
Country: PINEAPPLE
Country: ORANGE
Country: RICE

관련 정보