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