导出文件的每一行(最后一行除外),以使用AWK为每一行创建一个新文件

问题描述 投票:1回答:3

例如,如果没有n行,则应创建n-1个文件。这是我到目前为止所取得的成就。我正在手动插入8(即总行数)。我不知道如何获取变量中的行总数,然后使用它。

awk '{if (NR<8) F=NR".ndjson"; print >> F; close (F)}' export.ndjson
linux unix awk scripting gnu
3个回答
1
投票

[IMHO可以通过wc命令获取总行数,然后将其存储到变量的一种方式。合理的警告,因为OP现在已经显示了示例,因此无法对其进行测试并在此处编辑/调整了OP的尝试。

awk -v lines="$(wc -l < "export.ndjson")" '{if (NR<lines) F=NR".ndjson"; print >> F; close (F)}' export.ndjson

[NOTE:另一种方法可以读取您的Input_fileexport.ndjson2次,取其第一次的总行数(仅行数)和第二次执行的总行数,我们可以使用该计数用于条件。



[第二解决方案:如果我的假设是正确的,并且只想保留最后一行,则可以尝试在tac + awk组合中保留第一行。

tac export.ndjson | awk 'FNR>1{F=NR".ndjson"; print >> F; close (F)}'

1
投票

如果您希望输出文件的编号从2开始,

awk 'NR>1{out=NR".json"; print prev > out; close(out)} {prev=$0}' export.ndjson

或在1:

awk 'NR>1{out=(NR-1)".json"; print prev > out; close(out)} {prev=$0}' export.ndjson

或:

awk 'NR>1{print prev > out; close(out)} {prev=$0; out=NR".json"}' export.ndjson

0
投票

将每一行打印到它自己的文件中,最后一行除外。

$ awk 'p{close(f); f=(NR-1)".ndjson"; print p > f} {p=$0}' file

还要注意,空行不会创建空文件。

逻辑只是将打印延迟一记录。

© www.soinside.com 2019 - 2024. All rights reserved.