【问题标题】:How to split a file with 250k columns vertically?如何垂直拆分具有 250k 列的文件?
【发布时间】:2023-03-09 04:18:01
【问题描述】:

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

【问题讨论】:

  • 脚本cut怎么样?

标签: unix awk


【解决方案1】:

使用 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

【讨论】:

  • OP 声明The number of columns in my file are not even
  • 谢谢,我已经修复了这个错误。
  • 感谢您的帮助。
【解决方案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

【讨论】:

    【解决方案3】:

    使用cut。它是 GNU coreutils 的一部分。

    假设您的输入文件列由空格分隔:

    cut -d " " -f1-4 /path/to/input/file > file1
    
    cut -d " " -f5-8 /path/to/input/file > file2
    
    ...
    

    有关更多信息,请参阅手册页 man cut

    【讨论】:

    • 感谢您的帮助。
    猜你喜欢
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2016-07-21
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    相关资源
    最近更新 更多