将大文件中的每第 N 行打印到一个新文件中

Ter*_*isa 43 text-processing

我试图将包含超过 300,000 条记录的文件中的每第 N 行打印到一个新文件中。这必须每第 N 个记录发生一次,直到它到达文件的末尾。

Dea*_*rip 69

awk 'NR % 5 == 0' input > output
Run Code Online (Sandbox Code Playgroud)

这将打印每五行。

要使用环境变量:

NUM=5
awk -v NUM=$NUM 'NR % NUM == 0' input > output
Run Code Online (Sandbox Code Playgroud)

  • 正如您在下面的“答案”中所评论的,请接受此答案作为解决方案。谢谢你。 (3认同)
  • 或从第一行开始的每 5 行使用“NR % 5 == 1”或从第四行开始的每 5 行使用“NR % 5 == 4” (2认同)

G-M*_*ca' 28

要打印每N ?? 行,请使用

sed -n '0~ N p'
例如,要每5日线复制oldfilenewfile,做

sed -n '0~5p' oldfile > newfile
Run Code Online (Sandbox Code Playgroud)

这用sed的第一个步骤地址的形式,这意味着“匹配每一个步骤“个线路启动与线第一”。理论上,这会打印 line?0, 5, 10, 15, 20, 25, ...,直到文件末尾。当然没有 line?0,所以它只打印 line?5, 10, 20, 25, ...;? 0~5只是一种方便的替代方式5~5 (从第 5 行开始打印每 5 行;即,第 5、10、15、20、25 行……)。

对于此sed功能的另一个示例(未回答问题),

sed -n '2~5p' oldfile
Run Code Online (Sandbox Code Playgroud)

将打印行? 2, 7, 12, 17, 22, 27, ...,直到文件末尾。

注意:这种方法需要 GNU sed,作为第一个? ~地址表是一个不可移植的扩展。(一些旧版本的 GNU sed 可能需要5~5表格而不是 0~5 表格。)

  • 我喜欢它使用`sed`,这是我最初搜索的,但在我的脑海中@deathgrip 对`awk` 的使用更清晰 (3认同)

Geo*_*iou 1

与 sed 类似,我们也有 awk:

$ seq 1000000000 |awk 'NR==500000{print;exit}'
500000
Run Code Online (Sandbox Code Playgroud)

NR=您要打印的行数(然后退出以避免等待文件完成)。在你的情况下

awk 'NR==Nth{print;exit}' inputfile >outputfile
Run Code Online (Sandbox Code Playgroud)

其中 Nth 是您需要打印的第 N 行号。