Bash:如果满足条件,则从CSV中删除行,如果未满足条件,则从CSV中删除行

时间:2015-07-23 08:29:13

标签: bash csv text awk

我希望你们都度过了愉快的一天。我有一个问题,我可以提供一些帮助。我有两个CSV个文件,两个文件都包含250k个记录。一个看起来像这样:

ProductCode,StockLevel,Active
4101385360060,0,1
6019002320030,0,0
3328200078030,0,0
2411000347030,93,1

另一个是这样的:

ProductURL,Product Code,Product Name,More Fields
"http://www.domain.com",4101385360060,Timberland 6 In Buck Boot WHEAT NUBUCK

我想要对第一个文件做的是删除所有不需要这些条件的记录:

<All ok>,<!=0>,<=1>

然后使用第二个文件删除第一个文件中NOT的所有行。

任何帮助 - 非常感谢。我怀疑awk是我的朋友。

干杯,

3 个答案:

答案 0 :(得分:2)

您可以使用此awk命令:

awk -F, 'FNR==NR && $2!=0 && $3==1{a[$1]; next} $1 in a' file1.csv file2.csv

但是我建议您在问题中提供更多具有预期输出的样本数据。

答案 1 :(得分:2)

听起来这就是你想要的:

$ cat tst.awk
BEGIN { FS="," }
FNR==1 { out=FILENAME"_out"; valid[$1] }
NR==FNR && ($2!=0) && ($3==1) { valid[$1] }
$1 in valid { print > out }

$ awk -f tst.awk file1 file2

$ cat file1_out
ProductCode,StockLevel,Active
2411000347030,93,1

$ cat file2_out
Product Code,Product Name

如果没有,请编辑您的问题以澄清您的要求,并提供更具真实代表性的样本输入和相关的预期输出。

答案 2 :(得分:1)

OP评论说id不是第二个文件的第一部分,所以一种方式可能是:

awk -F\, 'NR>1&&$2&&$3==1' file1 |tee -a file1_filtered |while IFS=, read -r id dummy; do 
   echo ",$id,"
done > pattern_file
grep -f pattern_file file2 >file2_filtered