打印新文件中的每 N 列

打印新文件中的每 N 列

如何打印一个文件的每 100 列,并在 10 个不同的文件中打印 1000 列? split命令用于将行拆分到不同的文件中。我正在寻找不同文件中的列。

答案1

bashcut

#! /usr/bin/env bash
for i in {0..9}; do
    let start=i*100+1
    let end=i*100+100
    cut -d ' ' -f ${start}-${end} file.txt >file_$i.txt
done

答案2

如果文件不是大,那么一种选择可能是转置、分割,然后转置结果,例如,如果您有GNUsplit选项--filter

rs -T < somefile | split -l100 --filter='rs -T > $FILE'

使用更易于管理的输入大小进行说明

$ printf 'A B C D E F G H I J\n0 1 2 3 4 5 6 7 8 9\na b c d e f g h i j\n' | 
    rs -T | split -l2 --filter='rs -T > $FILE'

然后

$ cat xaa
A  B
0  1
a  b

$ cat xae
I  J
8  9
i  j

答案3

单独使用awk

awk '{i=0; split($0, arry, / +/); 
    for (x in arry) {
        if ((x%100)==1)i++; printf (x%100)?arry[x]FS:arry[x]"\n" >"FILE_"i
    }
}' in_multiple_files

简单的 40 列输入并用x%10

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 c22 c23 c24 c25 c26 c27 c28 c29 c30 c31 c32 c33 c34 c35 c36 c37 c38 c39 c40
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN

结果是4个文件。

==> FILE_1 <==
1 2 3 4 5 6 7 8 9 10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10
A B C D E F G H I J

==> FILE_2 <==
11 12 13 14 15 16 17 18 19 20
c11 c12 c13 c14 c15 c16 c17 c18 c19 c20
K L M N O P Q R S T

==> FILE_3 <==
21 22 23 24 25 26 27 28 29 30
c21 c22 c23 c24 c25 c26 c27 c28 c29 c30
U V W X Y Z AA AB AC AD

==> FILE_4 <==
31 32 33 34 35 36 37 38 39 40
c31 c32 c33 c34 c35 c36 c37 c38 c39 c40
AE AF AG AH AI AJ AK AL AM AN

答案4

awk解决方案:

awk -v n=100 '{ r=""; 
                for(i=1;i<=NF;i++) { 
                    f=sprintf("%s%s",$i,(!(i%n))?"":OFS); 
                    r=(r!="")? r OFS f : f; 
                    if (!(i%n)) { print r > FILENAME"_"++c; r="" } 
                } 
                c=0 }' file

  • -v n=100- 可调分流系数

  • r=""- 初始化结果字符串

  • !(i%n)- 确定应按系数的归档数倍分割记录的时刻n

相关内容