如何垂直拆分250k列的文件?

时间:2014-02-18 23:32:46

标签: unix awk

我需要根据大小(首选)或列数将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 

3 个答案:

答案 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