次の40行ファイルがあります。
0001.Group admin_group
0001.Users adam, sam, paul, david, jennifer, harry
0002.Group Dev_group
0002.Users mike, pauli, gary, sherry
0003.Group Sec_group
0003.Users david, diana, mike, paul, harry
0004.Group Main_group
0004.Users wilson, robert, samule
プレフィックスを使用してグループとユーザーを抽出し、グループと同じ名前で新しいファイルを作成する必要があります。
次のようにする必要があります。
出力ファイル名:
admin_group
、内容:0001.Group admin_group 0001.Users adam, sam, paul, david, jennifer, harry
出力ファイル名:
Dev_group
、内容:0002.Group Dev_group 0002.Users mike, pauli, gary, sherry
最後に、20の新しいテキストファイルが必要です。 sedとawkを使用して2つの別々のファイルを作成しようとしましたが、失敗しました。 BashやPythonでどのように入手できますか?
答え1
そしてawk
:
$ awk -v FS="\t" '$1 ~ /Group/ { file = $2 } { print $0 > file }' input.txt
awk
Group
最初の列に1つがあることを確認してください。この場合、2番目の列の値を変数に保存しますfile
。
確認後、行全体が印刷され、>
名前が変数に保存されているファイルにリダイレクトされますfile
。
答え2
sed
エディタを使用して入力ファイルに対して2つのパスを実行できます。最初のステップでは、目的の出力を生成するために2番目のステップで使用するsedコマンドのリストを生成します。
$ sed -ne '
s/.*[[:blank:]]//
s|.*|/&/{N;w &\n}|w sed_code
n
' input-file.txt
だから今回は2回目です。生成されるファイル名に正規表現特殊文字が含まれていないとします。
$ sed -nf sed_code input-file.txt
これを行うためにPerlを展開することもできます。
$ perl -aMautodie -pe '
open my $fh, ">", $F[1];
$_ .= <>;
select $fh;
' input.txt
答え3
awkバージョンほどスマートではありませんが、ここに代替案があります。
497844.txtがファイル名です。問題番号を使用しました。
for f in `cut -f1 -d. 497844.txt | sort | uniq`
do
group=`grep $f.Group 497844.txt`
fn=`echo $group| cut -f2 -d" "`
grep ^$f 497844.txt > $fn
done
説明する。
各一意のグループ番号について、グループを含む行の値であるファイル名を取得します。
次に、そのグループ番号を含む各行を抽出し、上からエクスポートしたファイルに出力をリダイレクトします。