40行のファイルから2行ずつ抽出し、新しいファイルを作成します。

40行のファイルから2行ずつ抽出し、新しいファイルを作成します。

次の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

awkGroup最初の列に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

説明する。

各一意のグループ番号について、グループを含む行の値であるファイル名を取得します。

次に、そのグループ番号を含む各行を抽出し、上からエクスポートしたファイルに出力をリダイレクトします。

関連情報