我有一个大文件,大约10。我有一个行号向量,我想用它来分割文件。理想情况下,我希望使用命令行实用程序来完成这一任务。作为一种准则:
文件:
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
行号向量:
2 5
期望产出:
档案1:
1 2 3
档案2:
4 5 6
7 8 9
10 11 12
档案3:
13 14 15
16 17 18
发布于 2020-07-19 11:50:15
这可能对你有用:
csplit -z file 2 5
或者如果你想要regexp:
csplit -z file /2/ /5/
对于默认值,输出文件将命名为xxnn
,其中nn
从00
开始,并递增1。
注:-z
选项可以防止空文件。
发布于 2020-07-17 12:46:30
使用awk:
$ awk -v v="2 5" ' # space-separated vector if indexes
BEGIN {
n=split(v,t) # reshape vector to a hash
for(i=1;i<=n;i++)
a[t[i]]
i=1 # filename index
}
{
if(NR in a) { # file record counter in the vector
close("file" i) # close previous file
i++ # increase filename index
}
print > ("file" i) # output to file
}' file
样本输出:
$ cat file2
4 5 6
7 8 9
10 11 12
发布于 2020-07-17 14:11:26
与James和kvantour的解决方案略有不同:将向量作为“文件”传递给awk
vec="2 5"
awk '
NR == FNR {nr[$1]; next}
FNR == 1 {filenum = 1; f = FILENAME "." filenum}
FNR in nr {
close(f)
f = FILENAME "." ++filenum
}
{print > f}
' <(printf "%s\n" $vec) file
$ ls -l file file.*
-rw-r--r-- 1 glenn glenn 48 Jul 17 10:02 file
-rw-r--r-- 1 glenn glenn 7 Jul 17 10:09 file.1
-rw-r--r-- 1 glenn glenn 23 Jul 17 10:09 file.2
-rw-r--r-- 1 glenn glenn 18 Jul 17 10:09 file.3
https://stackoverflow.com/questions/62953828
复制相似问题