Shell 不仅每N行拆分一个文件,而且还为每个分离的文件指定可变页眉和常量页脚

Shell 不仅每N行拆分一个文件,而且还为每个分离的文件指定可变页眉和常量页脚,shell,unix,command-line,awk,Shell,Unix,Command Line,Awk,我已经找到了许多关于如何将文件分割成多个部分的代码示例,但奇怪的是,我还没有找到解决这个问题的方法 因此,如果我有一个巨大的输入文件: input.txt: A B C D E F G H Page 1 A B C The end Page 2 D E F The end Page 3 G H The end 如何每3行拆分一次,在开头插入页码,在结尾插入“结束”消息 part1.txt: A B C D E F G H Page 1 A B C The end Page 2 D E

我已经找到了许多关于如何将文件分割成多个部分的代码示例,但奇怪的是,我还没有找到解决这个问题的方法

因此,如果我有一个巨大的输入文件:

input.txt

A
B
C
D
E
F
G
H
Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
如何每3行拆分一次,在开头插入页码,在结尾插入“结束”消息

part1.txt

A
B
C
D
E
F
G
H
Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
part2.txt

A
B
C
D
E
F
G
H
Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
part3.txt

A
B
C
D
E
F
G
H
Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
我在整个网站上都找到了这个awk代码:

awk 'END {printf "The end", c > f}
!(NR%3) || NR == 1 {if (f) {printf "The end", c > f; close (f)}
printf "Page %03d\n", ++c > (f = "path/to/part" c ".txt")}
{print > f}' path/to/input.txt

但是它不能正常工作。

尽管您可以使用一个awk执行此操作,并通过基于另一种计数器变量设置filename将输出重定向到文件,但我可以想到awk和split的组合,如下所示:

awk 'BEGIN {k=1;print "Page 1"} {i++; print $NF;if (i%3 == 0) {print "The end"; k++; printf ("Page %d\n", k)}} END{print "The end"}' /path/to/test.txt | split -l 5 -d - /path/to/part
awk-在上面有三个部分

开始-默认情况下,开始打印第1页。
主块-打印整行,检查文件中是否有第三行、第六行等(即三行的倍数),打印结尾并打印下一行的页码。
结束-最后打印最后一页的结束

拆分-将在一个文件中拆分5行,前缀为“Part”,后缀为“01”,然后是“02”,您可以对其进行更改

虽然您可以使用一个awk执行此操作,并通过基于另一种计数器变量设置filename将输出重定向到文件,但我可以想到awk和split的组合,如下所示:

awk 'BEGIN {k=1;print "Page 1"} {i++; print $NF;if (i%3 == 0) {print "The end"; k++; printf ("Page %d\n", k)}} END{print "The end"}' /path/to/test.txt | split -l 5 -d - /path/to/part
awk-在上面有三个部分

开始-默认情况下,开始打印第1页。
主块-打印整行,检查文件中是否有第三行、第六行等(即三行的倍数),打印结尾并打印下一行的页码。
结束-最后打印最后一页的结束

拆分-将在一个文件中拆分5行,前缀为“Part”,后缀为“01”,然后是“02”,您可以对其进行更改

虽然您可以使用一个awk执行此操作,并通过基于另一种计数器变量设置filename将输出重定向到文件,但我可以想到awk和split的组合,如下所示:

awk 'BEGIN {k=1;print "Page 1"} {i++; print $NF;if (i%3 == 0) {print "The end"; k++; printf ("Page %d\n", k)}} END{print "The end"}' /path/to/test.txt | split -l 5 -d - /path/to/part
awk-在上面有三个部分

开始-默认情况下,开始打印第1页。
主块-打印整行,检查文件中是否有第三行、第六行等(即三行的倍数),打印结尾并打印下一行的页码。
结束-最后打印最后一页的结束

拆分-将在一个文件中拆分5行,前缀为“Part”,后缀为“01”,然后是“02”,您可以对其进行更改

虽然您可以使用一个awk执行此操作,并通过基于另一种计数器变量设置filename将输出重定向到文件,但我可以想到awk和split的组合,如下所示:

awk 'BEGIN {k=1;print "Page 1"} {i++; print $NF;if (i%3 == 0) {print "The end"; k++; printf ("Page %d\n", k)}} END{print "The end"}' /path/to/test.txt | split -l 5 -d - /path/to/part
awk-在上面有三个部分

开始-默认情况下,开始打印第1页。
主块-打印整行,检查文件中是否有第三行、第六行等(即三行的倍数),打印结尾并打印下一行的页码。
结束-最后打印最后一页的结束
拆分-将在一个文件中拆分5行,前缀为“Part”,后缀为“01”,然后是“02”,您可以对其进行更改

awk方式

有点长,我会试着把它缩短

awk 'NR%3==1{if(x)print "The end" > f;$0="Page "++x"\n"$0;f="part"x".txt"}{print > f}END{print "The end" > f}' file
使用
关闭

awk 'NR%3==1{if(x){print "The end" > f;close(f)}$0="Page "++x"\n"$0;f="part"x".txt"}{print > f}END{print "The end" > f}' file
输出
Part1.txt

Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
Part2.txt

Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
Part3.txt

Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
awk方式

有点长,我会试着把它缩短

awk 'NR%3==1{if(x)print "The end" > f;$0="Page "++x"\n"$0;f="part"x".txt"}{print > f}END{print "The end" > f}' file
使用
关闭

awk 'NR%3==1{if(x){print "The end" > f;close(f)}$0="Page "++x"\n"$0;f="part"x".txt"}{print > f}END{print "The end" > f}' file
输出
Part1.txt

Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
Part2.txt

Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
Part3.txt

Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
awk方式

有点长,我会试着把它缩短

awk 'NR%3==1{if(x)print "The end" > f;$0="Page "++x"\n"$0;f="part"x".txt"}{print > f}END{print "The end" > f}' file
使用
关闭

awk 'NR%3==1{if(x){print "The end" > f;close(f)}$0="Page "++x"\n"$0;f="part"x".txt"}{print > f}END{print "The end" > f}' file
输出
Part1.txt

Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
Part2.txt

Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
Part3.txt

Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
awk方式

有点长,我会试着把它缩短

awk 'NR%3==1{if(x)print "The end" > f;$0="Page "++x"\n"$0;f="part"x".txt"}{print > f}END{print "The end" > f}' file
使用
关闭

awk 'NR%3==1{if(x){print "The end" > f;close(f)}$0="Page "++x"\n"$0;f="part"x".txt"}{print > f}END{print "The end" > f}' file
输出
Part1.txt

Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
Part2.txt

Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end
Part3.txt

Page 1
A
B
C
The end
Page 2
D
E
F
The end
Page 3
G
H
The end

您可以大大简化awk脚本

我会做类似的事情

$ awk 'NR%3==1{count++;} {print > "part"count".txt"}' input
它将输出为

part1.txt
A
B
C
part2.txt
D
E
F
part3.txt
G
H

您可以大大简化awk脚本

我会做类似的事情

$ awk 'NR%3==1{count++;} {print > "part"count".txt"}' input
它将输出为

part1.txt
A
B
C
part2.txt
D
E
F
part3.txt
G
H

您可以大大简化awk脚本

我会做类似的事情

$ awk 'NR%3==1{count++;} {print > "part"count".txt"}' input
它将输出为

part1.txt
A
B
C
part2.txt
D
E
F
part3.txt
G
H

您可以大大简化awk脚本

我会做类似的事情

$ awk 'NR%3==1{count++;} {print > "part"count".txt"}' input
它将输出为

part1.txt
A
B
C
part2.txt
D
E
F
part3.txt
G
H

另一种方法

#!/usr/bin/awk -f

BEGIN {
    part=1;
    print("Part "part) > "part"part".txt";
}

{
    if (NR%3 == 0 ) {
        print($0) > "part"part".txt";
        print("The end") > "part"part".txt";
        part++;
        print("Part "part) > "part"part".txt";
    } else {
        print($0) > "part"part".txt";
    }
}

END {
    print("The end") > "part"part".txt";
}
输出:

$ cat part{1..3}.txt
Part 1
A
B
C
The end
Part 2
D
E
F
The end
Part 3
G
H
The end

另一种方法

#!/usr/bin/awk -f

BEGIN {
    part=1;
    print("Part "part) > "part"part".txt";
}

{
    if (NR%3 == 0 ) {
        print($0) > "part"part".txt";
        print("The end") > "part"part".txt";
        part++;
        print("Part "part) > "part"part".txt";
    } else {
        print($0) > "part"part".txt";
    }
}

END {
    print("The end") > "part"part".txt";
}
输出:

$ cat part{1..3}.txt
Part 1
A
B
C
The end
Part 2
D
E
F
The end
Part 3
G
H
The end

另一种方法

#!/usr/bin/awk -f

BEGIN {
    part=1;
    print("Part "part) > "part"part".txt";
}

{
    if (NR%3 == 0 ) {
        print($0) > "part"part".txt";
        print("The end") > "part"part".txt";
        part++;
        print("Part "part) > "part"part".txt";
    } else {
        print($0) > "part"part".txt";
    }
}

END {
    print("The end") > "part"part".txt";
}
输出:

$ cat part{1..3}.txt
Part 1
A
B
C
The end
Part 2
D
E
F
The end
Part 3
G
H
The end

另一种方法

#!/usr/bin/awk -f

BEGIN {
    part=1;
    print("Part "part) > "part"part".txt";
}

{
    if (NR%3 == 0 ) {
        print($0) > "part"part".txt";
        print("The end") > "part"part".txt";
        part++;
        print("Part "part) > "part"part".txt";
    } else {
        print($0) > "part"part".txt";
    }
}

END {
    print("The end") > "part"part".txt";
}
输出:

$ cat part{1..3}.txt
Part 1
A
B
C
The end
Part 2
D
E
F
The end
Part 3
G
H
The end


输出文件名在哪里?什么是
5
?行数?是,表示每个文件的行数。我已经更新了答案来说明它的含义。如果我在文件夹
D:/path/folder
,我是否需要粘贴
D:/path/folder/test.txt | split-l 5-D:/path/folder/part
?是的,但是D:看起来像是windows驱动器吗?好的,试试看是否对你有帮助。输出文件名在哪里?什么是
5
?行数?是,表示每个文件的行数。我已经更新了答案来说明它的含义。如果我在文件夹
D:/path/folder
,我是否需要粘贴
D:/path/folder/test.txt | split-l 5-D:/path/folder/part
?是的,但是D:看起来像是windows驱动器吗?好的,试试看是否对你有帮助。输出文件名在哪里?什么是
5
?行数?是,表示每个文件的行数。我已经更新了答案来说明它的含义。如果我在文件夹
D:/path/folder
,我是否需要粘贴
D:/path/folder/test.txt | split-l 5-D:/path/folder/part
?是的,但是D:看起来像是windows驱动器吗?好的,试试看是否对你有帮助。输出文件名在哪里?什么是
5
?行数?是,表示每个文件的行数。我已经更新了答案来说明它的含义。如果我在文件夹
D:/path/folder
,我是否需要粘贴
D:/path/folder/test.txt | split-l 5-D:/path/folder/part
?是的,但是D:似乎是windows驱动器吗?好的,试试看他是否这样做