タブで区切られた行を持つファイルを 2 つのファイルに分割する

タブで区切られた行を持つファイルを 2 つのファイルに分割する

sedファイルを2つに分割して、

eric    shwartz
david    snyder

エントリ間の 4 つのスペースは、実際には 2 つのファイルへのタブです。例:

file1:

eric
david

file2:

shwartz
snyder

したがって、各行のタブの後のすべてが別のファイルに格納されます。

答え1

解決策としては次のようなものが考えられます。

awk '{ print $1 > "file1"; print $2 > "file2"}' file 

答え2

1 つのスクリプトにする必要がありますか? そうでない場合は、次のようにします。

cut -f 1 file > file1
cut -f 2 file > file2

cut列を選択します(デフォルトではタブで区切られます)。 -f は数値を引数として受け取るフラグであり、この数値は列の数です。

答え3

これ以上簡単なことはないと思うawkアプローチ、そこで、任意の数の列に対して機能し、各列を独自のファイルに保存する Perl ソリューションを次に示します。

perl -ane 'unless($handles[0]){
            for(1..$#F+1){
                open(my $fh, ">","file$_"); 
                $handles[$_-1] = $fh
            }
           } 
           for my $i (0..$#F){
                print { $handles[$i] } "$F[$i]\n"
           }' file 

次のような入力ファイルがあるとします。

$ cat file
foo bar baz bad
foo bar baz bad
foo bar baz bad
foo bar baz bad
foo bar baz bad
foo bar baz bad

上記のスクリプトは、関連する列を含む各ファイルを作成しfile1ますfile4


もちろん、 でまったく同じことをawk、はるかにシンプルかつエレガントに実行することもできますが、それでは面白くないですよね?

awk '{for(i=1;i<=NF;i++){print $i > "file"i}}' file 

答え4

moreutils(多くのディストリビューションリポジトリで利用可能、またはhttp://joeyh.name/code/moreutils/) には便利なユーティリティがいくつかあり、そのうちの 1 つがここで役立ちます。

pee 'cut -f1 >file1' 'cut -f2 >file2' < file

関連情報