如何在 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