以下のリストからメンバー名を抽出して新しいファイルに出力するにはどうすればよいですか?
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
。そのような行が見つかったら、2番目のフィールドから始めて、その行のスペースで区切られたフィールドを繰り返します。各フィールドには、独自の行に印刷される前に末尾のカンマ(存在する場合)が削除されます。
出力を保存するには、出力を新しいファイルにリダイレクトし、次を使用します。
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
Pythonで試してみましたが、うまくいきます。
#!/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」行がある場合は機能します。