![打印新文件中的每 N 列](https://linux22.com/image/118854/%E6%89%93%E5%8D%B0%E6%96%B0%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%AF%8F%20N%20%E5%88%97.png)
如何打印一个文件的每 100 列,并在 10 个不同的文件中打印 1000 列?
split
命令用于将行拆分到不同的文件中。我正在寻找不同文件中的列。
答案1
与bash
和cut
:
#! /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