删除一定行数之后的所有行

删除一定行数之后的所有行

如何在 csv 文件中截断 1000 行?目标是仅保留文件中的前 1000 行并删除所有其他行。

答案1

您可以使用head -n <n>打印第一n行:

head -n 1000 "file.csv"

要写入文件,请使用重定向:

head -n 1000 "file.csv" > "some_other_file.csv"

要覆盖同一个文件,您需要先写入临时文件,然后覆盖原始文件...

head -n 1000 "file.csv" > "file.csv.tmp" && mv "file.csv.tmp" "file.csv"
# or more safe use mktemp
tmpfile=$(mktemp)
head -n 1000 "file.csv" > "$tmpfile" && mv "$tmpfile" "file.csv"

... 或使用sponge(部分moreutils--> sudo apt install moreutils)

head -n 1000 "file.csv" | sponge "file.csv"

sed使用 GNU 版本和来编辑文件的其他(非可移植)选项awk

sed -i 1000q "file.csv"
# or
sed -n -i '1,1000p' "file.csv"
# or
sed -i '1001,$d' "file.csv"
# or
awk -i inplace 'NR>1000{exit}1' "file.csv"

答案2

在终端运行:

head -n 1000 /path/to/file.csv

要将结果保存在单独的文件中,请运行:

head -n 1000 /path/to/file.csv > /path/to/new_file_with_first_1000_linces.csv

答案3

POSIX 标准实用程序编辑iting 文件是ed公用事业,你可以像这样使用它:

ed file.csv <<-HERE
  ,1000w
  q
HERE

ed file.csv启动ed实用程序并打开文件file.csv进行编辑。ed旨在以交互方式使用,因此它的工作方式是您输入命令ed然后ed执行这些命令。

但是,我们想在脚本中使用它,而不是以交互方式,所以我们使用此处文档,这使得我们可以重定向 stdin,就好像我们自己输入了这些命令一样。

命令ed通常采用以下形式地址单字母

ed我们脚本中的第一个命令是,1000w。这里的地址是一个地址范围:,1000与“从 1 到 1000 的所有行”的含义相同1,1000。命令是w,它是命令。写入命令采用可选的文件名参数,但如果不提供,它将采用最后使用的文件,这正是我们想要的。

第二条命令就是辞职命令。

因此,此脚本告诉您ed,将w前 1000 行写回到文件,然后q退出。最终结果正是您想要的:将输入文件截断为 1000 行。

但要小心!1000 行并不意味着 1000 列!CSV 文件的单元格内可以包含换行符例如,这个 CSV 有两行但只有一行:

"Cell #1","Cell
#2"

如果你的实际目标是选择前 1000 名,则需要使用 CSV 解析器解析 CSV 文件。例如,使用Python脚本如下:

#!/usr/bin/env python3

import csv

with open("file.csv", newline="") as f:
    reader = csv.reader(f)
    rows = [row for row in reader][:1000]

with open("file.csv", "w") as f:
    writer = csv.writer(f)
    writer.writerows(rows)

答案4

由于它是 CSV,因此使用 miller:

miller —-csv head -n 1000 file.csv

相关内容