从一个文件中提取数据并基于一个列值将其放置在不同的文件中


14

我们将生成一个具有以下值的csv文件

yp1234,577,1,3
yp5678,577,3,5
yp9012,132,8,9

我需要提取数据并根据第二列创建文件。如果是577,则必须提取整行并将其放在单独的文件中。我的意思是我需要一个第二行的行单独为577的文件,第二行的行单独为132的文件

我尝试使用IF,但是没有用


5
实际上,发布不起作用的代码总是一个好主意。
goldilocks 2014年

Answers:


27

用途awk

awk -F, '{ print > $2 ".csv" }' file.csv

这将创建两个文件577.csv,并132.csv在当前目录。

上面的命令假定您只能具有132577作为第二个字段。它将为整个的第二个字段中找到的每个值创建一个文件名file.csv

如果除了您感兴趣的两个值之外还有其他值,并且您想忽略这些行,请执行以下操作:

awk -F, '$2 == "577" || $2 == "132" { print > $2 ".csv" }' file.csv

1
有许多awk无法使用的错误实现print > $2 ".cvs"。在这些文件上,您必须首先计算文件名,然后执行printfname = $2 ".cvs"; print > fname
库萨兰达

3

我喜欢terdon的awk解决方案,但是为了完整起见,这里的建议仅使用bash

while IFS=, read -r a1 a2 a3 a4; do 
    echo "$a1,$a2,$a3,$a4" >> "$a2".csv
done < file.csv

这将产生的文件577.csv,并132.csv在当前目录中。


3

将所有577提取到标准输出

grep -e '^.*,577,.*,.*$' youfile.csv >result_extract_557.csv

-根据以下@terdon的注释编辑1更正,以避免当至少3个逗号与577一致时避免错误匹配。

grep -e '^[:alnum:]*,577,[:digit:]*,[:digit:]*$' youfile.csv >result_extract_557.csv

但是我认为他/她的awk解决方案更全面。


即使577在另一个字段而不是第二个字段上,或者它是字段的一部分,也将匹配。例如foo577baryp9012,132,8,577
terdon

我以为逗号会使它取决于字段位置?
X田

抱歉,我给了不好的例子,但是它们.*也可以匹配逗号,所以您不知道要匹配哪个字段。可能是第二,也可能是第45。我的第二个抱怨是错误的,您是对的,以防逗号不匹配foo577bar
terdon

如果| 使用字符代替。
user3116123 2014年

收到以下错误grep:非法选项-e用法:grep -hblcnsviw模式文件。。。
user3116123 2014年

1

使用csvkit

$ csvgrep -c 2 -m 577 data.csv >output.csv

-c 2品牌cvsgrep考虑第二列,并与-m 577我们要求它匹配字符串577中该列。

以下内容将写入output.csv

yp1234,577,1,3
yp5678,577,3,5

要匹配多个字符串并将每个字符串的输出写入文件:

for pattern in 577 132; do
  csvgrep -c 2 -m "$pattern" data.csv >"output-$pattern.csv"
done

这将创建两个文件output-132.csvoutput-577.csv

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.