아래와 같은 목록에서 멤버 이름을 추출하여 새 파일로 출력하려면 어떻게 해야 하나요?
Group-name supernatural
Members admin, Admin1, John, sam, dean
Group-id 405
newfile.txt의 예상 출력:
admin
Admin1
John
sam
dean
답변1
$ awk '/^Members/ { for (i=2; i<=NF; ++i) { sub(",$", "", $i); print $i } }' file
admin
Admin1
John
sam
dean
awk
이것은 문자열로 시작하는 줄을 찾는 데 사용됩니다 Members
. 그러한 행이 발견되면 두 번째 필드부터 시작하여 해당 행의 공백으로 구분된 필드를 반복합니다. 각 필드에는 자체 줄에 인쇄되기 전에 후행 쉼표(있는 경우)가 제거됩니다.
출력을 저장하려면 출력을 새 파일로 리디렉션하고 다음을 사용하십시오.
awk ...as above... file >newfile
사용 sed
:
$ sed -n '/^Members[[:blank:]]*/{ s///; s/,[[:blank:]]*/,/g; y/,/\n/; p; }' file
admin
Admin1
John
sam
dean
해당 문자열로 시작하는 줄을 찾은 다음 Members
해당 문자열과 그 뒤에 오는 공백(탭 또는 공백)을 제거합니다. 그런 다음 줄의 나머지 부분에서 쉼표 뒤의 모든 공백을 제거하고 결과 목록을 인쇄하기 전에 쉼표를 줄 바꿈으로 변경합니다.
GNU를 사용하면 sed
다음과 같이 결합할 수 있습니다.
s/,[[:blank:]]*/,/g; y/,/\n/; p;
입력하다
s/,[[:blank:]]*/\n/gp;
답변2
다음 awk 및 sed 명령 조합을 사용해 볼 수 있습니다.
awk '/^Members/{$1=" ";print $0}' filename |sed "s/,/\n/g"| sed -r "s/^\s+//g"
산출
admin
Admin1
John
sam
dean
답변3
파이썬으로 시도해 보았는데 훌륭하게 작동합니다.
#!/usr/bin/python
import re
import subprocess
k=re.compile(r'^Members')
y=open('u.txt','r')
for i in y:
if re.search(k,i):
k=re.sub("Members"," ",i)
print re.sub(",","\n",k).strip()
praveen@praveen:~$
산출
admin
Admin1
John
sam
dean
답변4
for member in $(cat /tmp/yourfile.txt | grep Members | cut -d' ' -f2-); do
echo $member | cut -d, -f1
done
결과:
admin
Admin1
John
sam
dean
파일에 "members" 줄이 여러 개 있으면 작동합니다.