如何创建保留具有特定值的列名的文件

时间:2018-10-24 01:16:19

标签: bash awk sed

我有一个文件,其中第一列采用某些值(在本例中为4)

product,0 0,no way
brand,0 0 0,detergent
product,0 0 1,sugar
negative,0 0 1, sight
city,0 0 2,grind

我想构造3个文件,一个文件具有3个列值,一个文件具有2个列值,而一个文件具有1个列值。 *此外,这些值之一必须是“产品”

file3.txt

product,0 0,no way
brand,0 0 0,detergent
product,0 0 1,sugar
negative,0 0 1, sight

file2.txt

product,0 0,no way
brand,0 0 0,detergent
product,0 0 1,sugar

file1.txt

product,0 0,no way
product,0 0 1,sugar

此程序可以在awk中自动执行吗? 此时,我正在手动制作要保留列名称的文件,并使用它

awk 'NR==FNR{v[$1]; next} $1 in v' values.txt FS=, datafile

2 个答案:

答案 0 :(得分:1)

您可以尝试

#! /usr/bin/awk -f

BEGIN { FS=","}
{ 
    if (length(w) < m && !($1 in w)) w[$1]=1
    if ($1 in w) print
}

chmod并像调用它一样

$ ./script.awk -v m=3 datafile > file3.txt

其中m是唯一值的数量

编辑

循环

for m in $(seq 100); do ./script.awk -v m=$m datafile > file$m.txt; done

答案 1 :(得分:0)

这没有一定的优雅,但可以。

awk -F, '{
if(!one) one=$1;
if(!two && $1 != one) two=$1;
if(!three && $1 != one && $1 != two) three=$1;

if (one && $1==one) {print $0 > "file1.txt"; print $0 > "file2.txt"; print $0 > "file3.txt";}
if (two && $1==two) {print $0 > "file2.txt"; print $0 > "file3.txt";}
if (three && $1==three) print $0 > "file3.txt";
}' values.txt