我正在进行大量数据合并打印,并且希望能够从大型数据库中输出(例如)10 个样本。我的目标是从提供的 .csv(包括第一行和最后一行)中提取均匀分布的 10 行,并将其输出为新的 .csv 文件。
答案1
此答案假设您的 csv 文件每行一行,这意味着没有连续的行。如果文件名为db.csv
,那么您可以使用以下命令获取 10 行,包括第一行和最后一行:
awk 'FNR==NR{next} FNR==1{n=NR-1} FNR>x || FNR==n{x+=n/9;print}' db.csv db.csv
怎么运行的
由于 csv 文件在命令行上列出了两次,awk
因此将读取它两次。第一个用于获取总行数。第二次用于打印选定的 10 行。
FNR==NR{next}
NR
是迄今为止读取的记录(行)总数。文件记录号FNR
等于迄今为止从此文件读取的记录(行)总数。所以,当 时FNR==NR
,我们仍在读取第一个文件。如果是这样,我们就跳到next
记录。FNR==1{n=NR-1}
如果我们到达此命令,则意味着我们位于第二次通读的第一行。在这种情况下,我们知道文件中的记录总数为
NR-1
。我们将此数字保存为n
.FNR>x || FNR==n{x+=n/9;print}
通读第二行的第一行,
FNR==1
并且x=0
。因此,FNR>x
我们打印该行。然后我们递增x
并n/9
在下一次打印一行,FNR>x
依此类推。该条件
FNR==n
确保打印文件中的最后一行。
例子
让我们创建一个包含 101 行的文件:
$ seq 101 >db.csv
现在,我们可以使用awk
命令打印文件中的 10 行,包括第一行和最后一行:
$ awk 'FNR==NR{next} FNR==1{n=NR-1} FNR>x || FNR==n{x+=n/9;print}' db.csv db.csv
1
12
23
34
45
57
68
79
90
101
答案2
尝试以下操作
SELECT your_column1, your_column2
FROM your_table_name
INTO OUTFILE '/tmp/ouput.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
这适用于 Windows 上的 Linux 替换
INTO OUTFILE '/tmp/output.csv'
和
INTO OUTFILE 'c:\output.csv'
答案3
如果您的 CSV 文件不受限制并且在字段值中包含换行符和逗号,您应该使用真正的 CSV 解析库,例如 python 中的一个可用标准:
import csv
def select_evenly(file_name, nr):
rows = []
with open(file_name) as fp:
for row in csv.reader(fp):
rows.append(row)
nr_rows = len(rows)
step = (nr_rows - 2.0) / (nr - 1)
yield rows[0]
for x in range(1, nr-1):
yield rows[int(x * step + 0.5)]
yield rows[-1]
for line in select_evenly("test.csv", 10):
print line