按列号拆分文件

按列号拆分文件

我有一个包含 10,671 列的文件。

我试图将其拆分为 10 个较小的文件,每个文件有 1000 列,直到打印所有列,命名为 file_transpose01、file_transpose02、... file_transpose10。我正在打印文件的第一列作为每个新子文件的第一列。

我知道可以这样做使用 awk 按行号

我正在尝试使用 NF 而不是 NR 来调整这种方法来按列分割:

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因为我想清楚地看到数据分割的位置 - 理解单行上的一千列可能有点困难。所以我将每一行删除到最后一列。每次我s/.* //在这里使用都是因为我只想显示一行的最后一列。例如,当我第一次运行它时,它打印...

1000
2000年
3000
4000
5000
6000
7000
8000
9000
10000
10671

...100次。这意味着每条线实际上看起来像......

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

...等等。sed肯定正确地分割了数据......

所以我认为按行将其分成单独的文件应该非常容易。所以我的下一步是:

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

...我最终得到了 11 个文件,/tmp其中所有列都被单独拆分。我可以...

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

...它会打印出来...

1000
1000
1000
1000

...25次。或者...

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

...和...

10671
10671
10671
10671

...还有25次...

相关内容