У меня есть файл, в котором первый столбец принимает определенные значения (в данном случае 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 файла: один с тремя значениями столбца, один с двумя значениями столбца и один с одним значением столбца. * Кроме того, одно из этих значений должно быть "product".

< Сильный > 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
1
vkaul11 24 Окт 2018 в 04:16

2 ответа

Лучший ответ

Ты можешь попробовать

#! /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
Diego Torres Milano 24 Окт 2018 в 05:47

Этому не хватает определенной элегантности, но это работает.

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
0
miken32 24 Окт 2018 в 01:58
52959816