我需要根据大小(首选)或列数将250k文件拆分为多个(~5)块。我知道split
命令用于逐行拆分,但不知道是否有任何类似的功能可以按列拆分。
我文件中的列数不均匀,因此块不能具有相同数量的列。
输入:
AA BB CC DD EE FF GG HH II JJ KK LL MM
NN OO PP QQ RR SS TT UU VV WW XX YY ZZ
期望的输出:
File1
AA BB CC DD
NN OO PP QQ
File2
EE FF GG HH
RR SS TT UU
File3
II JJ KK LL MM
VV WW XX YY ZZ
答案 0 :(得分:3)
使用awk,您可以将n调整为您期望的数字。
awk '{for (i=1;i<=NF;i++)
printf (i%n==0||i==NF)?$i RS:$i FS > "File" int((i-1)/n+1) ".txt"
}' n=5 file
答案 1 :(得分:2)
使用cut
。它是GNU coreutils的一部分。
假设您的输入文件列以空格分隔:
cut -d " " -f1-4 /path/to/input/file > file1
cut -d " " -f5-8 /path/to/input/file > file2
...
有关详细信息,请参见手册页man cut
。
答案 2 :(得分:2)
我会使用awk
。不确定您是否希望每个文件有5列,因为您提到您有250k列可以创建50k文件,但这里有一些可以帮助您入门:
awk '{
y=1
for(i=1;i<NF;i++) {
if(i%5==0) {
print $i > "text"y".txt"
y+=1
continue
}
printf "%s ",$i >"text"y".txt"
}
print $NF > "text"y".txt"}' file
$ cat file
AA BB CC DD EE FF GG HH II JJ KK LL MM
NN OO PP QQ RR SS TT UU VV WW XX YY ZZ
$ awk '{
y=1
for(i=1;i<NF;i++) {
if(i%5==0) {
print $i > "text"y".txt"
y+=1
continue
}
printf "%s ",$i >"text"y".txt"
}
print $NF > "text"y".txt"}' file
$ head text*
==> text1.txt <==
AA BB CC DD EE
NN OO PP QQ RR
==> text2.txt <==
FF GG HH II JJ
SS TT UU VV WW
==> text3.txt <==
KK LL MM
XX YY ZZ