我有一个包含 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次...