问题是原始文件可能包含 0 到 45 行,但总是能被 3 整除。
我尝试了该split -l
命令,但它创建了太多文件。我希望有人能为我指出正确的方向,但我认为事实并非split
如此。
包含 15 行的原始文件示例:
lineAA|data|Format via FG|398
lineAB|data|Format via FG|398
lineAC|data|Format via FG|398
line_XA|data|Format via FG|398
line_XB|data|Format via FG|398
line_XC|data|Format via FG|398
line_ZA|data|Format via FG|398
line_ZB|data|Format via FG|398
line_ZC|data|Format via FG|398
line_XX|data|Format via FG|398
line_XY|data|Format via FG|398
line_XZ|data|Format via FG|398
line_FA|data|Format via FG|398
line_FB|data|Format via FG|398
line_FC|data|Format via FG|398
...
输出示例:
文件-1
lineAA|data|Format via FG|398
lineAB|data|Format via FG|398
lineAC|data|Format via FG|398
line_FA|data|Format via FG|398
line_FB|data|Format via FG|398
line_FC|data|Format via FG|398
文件-2
line_XA|data|Format via FG|398
line_XB|data|Format via FG|398
line_XC|data|Format via FG|398
文件-3
line_ZA|data|Format via FG|398
line_ZB|data|Format via FG|398
line_ZC|data|Format via FG|398
文件4
line_XX|data|Format via FG|398
line_XY|data|Format via FG|398
line_XZ|data|Format via FG|398
答案1
awk解决方案:
awk 'BEGIN{ f=1 }!(NR%3){ n=NR+1 }NR==n{ f++ }
{ print > "STATUS_FILE-"f".txt" }!(NR%12){ f=0 }' file
BEGIN{ f=1 }
- 设置初始文件索引号!(NR%3)
- 计算true
每第三行f++
- 每第三行后增加文件索引号!(NR%12){ f=0 }
- 每第 12 行(第 4 部分)后重置文件索引号print > "STATUS_FILE-"f".txt"
- 将行打印到具有所需文件索引号的文件中
查看结果:
$ head STATUS_FILE*
==> STATUS_FILE-1.txt <==
lineAA|data|Format via FG|398
lineAB|data|Format via FG|398
lineAC|data|Format via FG|398
line_FA|data|Format via FG|398
line_FB|data|Format via FG|398
line_FC|data|Format via FG|398
==> STATUS_FILE-2.txt <==
line_XA|data|Format via FG|398
line_XB|data|Format via FG|398
line_XC|data|Format via FG|398
==> STATUS_FILE-3.txt <==
line_ZA|data|Format via FG|398
line_ZB|data|Format via FG|398
line_ZC|data|Format via FG|398
==> STATUS_FILE-4.txt <==
line_XX|data|Format via FG|398
line_XY|data|Format via FG|398
line_XZ|data|Format via FG|398
打造“独立”awk脚本:
split_on_4x3.awk
脚本内容:
#!/bin/awk -f
BEGIN { f=1 }
!(NR%3) { n=NR+1 }
NR==n { f++ }
{ print > "STATUS_FILE-"f".txt" }
!(NR%12) { f=0 }
用法:
awk -f split_on_4x3.awk inputfile
答案2
这会将您的文件一次以三行为一组,循环写入每个file0.txt
, file1.txt
, file2.txt
, file3.txt
。我已将其分成几行,但只需将各行连接在一起即可将其组合为一行:
awk '
BEGIN { f=-1 }
!( (NR-1) % 3) { f = (f+1) % 4 }
{ print > "file" f ".txt" }
' source.txt
该awk
程序有三个指令。该BEGIN {}
块在程序启动时、在读取第一行之前执行。每行输入都应用于其余两条指令。第一个以三组为一组对行进行计数(NR
保存当前行号),并在每组末尾递增文件号,f
.当文件编号到达第四项时,它会重置回第一项。 (这种计数和重置方法使用模运算符 . %
)
答案3
听起来你想使用split
.从其手册页:
NAME split -- split a file into pieces SYNOPSIS split [-a suffix_length] [-b byte_count[k|m]] [-l line_count] [-p pattern] [file [name]] DESCRIPTION The split utility reads the given file and breaks it up into files of 1000 lines each. If file is a single dash (`-') or absent, split reads from the standard input. The options are as follows: [...] -l line_count Create smaller files n lines in length.
split bigfile -l3
将分成bigfile
较小的文件,每个文件包含三行。