是否可以一次将 4 个文件中的一个文件分成 3 行?

是否可以一次将 4 个文件中的一个文件分成 3 行?

问题是原始文件可能包含 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较小的文件,每个文件包含三行。

相关内容