다음과 같은 파일이 있습니다.
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
답변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
이는 세 가지 대체에 적용됩니다.
This is
뒤에 오는 텍스트를a
또는an
로 바꿉니다Country:
._
단어의 시작 부분을 삭제합니다 ._
단어 끝에서 삭제합니다.
마지막 두 교체는 테이블의 데이터를 허용합니다.
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