列番号でファイルを分割する

列番号でファイルを分割する

10,671列のファイルがあります。

すべての列が印刷されるまで、file_transpose01、file_transpose02、... file_transpose10という名前の1000個の列を持つ10個の小さなファイルに分割しようとします。ファイルの最初の列を各新しいサブファイルの最初の列として印刷しています。

私はそれが可能であることを知っています行番号としてawkを使用する

NRの代わりにNFを使用して列に分割するようにこの方法を適用しようとしています。

awk 'BEGIN{$1;}NF%1000==2{x="masterfile_transposed"++i;a[i]=x;print f>x;}{print > x}' masterfile

しかし、エラーが発生します。

expression for `>' redirection has null string value. I am not sure what is wrong with my syntax. Is it possible to do this task using awk?

このアプローチをどのように機能させることができますか?それとも、より良いアプローチがありますか?

答え1

awk -v ncols=1000 '
    {
        f=1
        file = "file_" f
        for (i=1; i <= NF; i++) {
            printf "%s%s", $i, OFS > file
            if (i % ncols == 0) {
                print "" > file
                f++
                file = "file_" f
            }
        }
        print "" > file
    }
' file

答え2

この列を何で区切るのかわかりませんが、次のようなファイルを作成しました。

 i=0
 until [ "$((i+=1))" -gt 100 ]
 do    seq -s '     ' 10671 
 done >/tmp/file

結果は100行と10671列で、それぞれは一連のスペースで区切られます。

次に私がしたことは:

sed 's/  */\n/1000;/\n/P;//D;G' </tmp/file | sed 's/.* //'

sedデータが分割される場所を明確に確認したいので、2番目のものを使用しています。単一行の何千もの列を理解するのは少し難しいかもしれません。だから最後の列まで各行を削除します。これを使用するたびに、s/.* //行の最後の列だけを表示したいからです。たとえば、初めて実行すると印刷されます。

1000
2000
3000
4000
5000
6000
7000
8000
9000
10000
10671

...100番。これは、各行が実際には次のように見えることを意味します。

1   2  3...1000
1001 1002 1003...2000

...など。sed間違いなくデータを正しく分割しました...

だから私はそれを1行ずつ別々のファイルに分割するのはかなり簡単だと思いました。だから私の次のステップは次のとおりです。

sed 's/  */\n/1000;/\n/P;//D;G' </tmp/file | 
sed -n "$(printf 'w /tmp/outfile.%d\nn\n' {1..11})"

/tmp...すべての列が個別に分割された11個のファイルが作成されました。私はできます...

sed 's/.* //' /tmp/outfile.1

...印刷されます...

1000
1000
1000
1000

...25番。または...

sed 's/.* //' /tmp/outfile.11

...そして...

10671
10671
10671
10671

...25回もっと...

関連情報