2013-03-08 1 views
0

Предполагая, что у нас есть следующая запись {(XXX1),(XXX2)},whatever Что я хочу, извлеките информацию на основе следующего правила, предпочтительно с помощью grep: , если {} содержит меньше или равным двум UNIQUE элементам, те, которые находятся внутри(), затем сохраняют (оба) из них, в противном случае удаляют всю строку. В качестве следующего шага, я хочу извлечь значения в пределах(), и, наконец, написать оставшиеся строки в следующем виде: XXX1,XXX2,whateverКак очистить файл CSV с помощью команды «grep»

ОБНОВЛЕНИЕ:

Для следующего ввода:

{(XXX1),(XXX2)},whatever,unique=2 
{(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2 
{(XXX1)},whatever,unique=1 
{},whatever,unique=0 
{(XXX1),(XXX2),(XXX3),(XXX4)},whatever 

я должен получить следующий вывод:

XXX1,XXX2,whatever,unique=2 
XXX1,whatever,unique=1 
+0

Вы не можете (надежно) работать с данными csv с помощью grep, поскольку записи cvs могут охватывать несколько строк. Даже если у вас их нет, grep, вероятно, не подходит для определения того, находится ли какая-либо данная запятая (или что бы то ни было ваш разделитель) внутри записи или ее разделение. –

+0

Хорошо, спасибо! Что бы вы мне порекомендовали? – user706838

+0

Существует http://www.aboutwilson.net/csvgrep/, но я не смотрел, что он может и чего не может сделать. Помимо этого, используйте некоторый правильный синтаксический анализатор CSV и сценарист/сериализатор и реализуйте над ним логику. Лично я бы проверял на рубиновые драгоценные камни, но выбор языка, вероятно, зависит от того, что вы знаете. –

ответ

1

AWK мог это сделать, проверить эту одну линию г:

awk -F'[}{]' '{split($2,a,",");delete(b);for(x in a)b[a[x]]}length(b)<=2' file 

давайте сделаем небольшой тест:

kent$ cat file 
ok,{(XXX1),(XXX2)},whatever,unique=2 
ok,{(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2 
ok,{(XXX1)},whatever,unique=1 
ok,{},whatever,unique=0 
nok,{(XXX1),(XXX2),(XXX3),(XXX4)},whatever 

kent$ awk -F'[}{]' '{split($2,a,",");delete(b);for(x in a)b[a[x]]}length(b)<=2' file 
ok,{(XXX1),(XXX2)},whatever,unique=2 
ok,{(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2 
ok,{(XXX1)},whatever,unique=1 
ok,{},whatever,unique=0 

вы можете видеть, nok линия была удалена

EDIT

awk -F'[}{]' '{gsub(/[()]/,"");split($2,a,",");delete(b);for(x in a)b[a[x]];l=length(b)}l<=2&&l>0{s="";for(x in b)s=s""x",";sub(/,$/,"",s);y[s]=s $3}END{for(x in y)print y[x]}' file 

тест

kent$ cat file 
{(XXX1),(XXX2)},whatever,unique=2 
{(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2 
{(XXX1)},whatever,unique=1 
{},whatever,unique=0 
{(XXX1),(XXX2),(XXX3),(XXX4)},whatever 

kent$ awk -F'[}{]' '{gsub(/[()]/,"");split($2,a,",");delete(b);for(x in a)b[a[x]];l=length(b)}l<=2&&l>0{s="";for(x in b)s=s""x",";sub(/,$/,"",s);y[s]=s $3}END{for(x in y)print y[x]}' file 
XXX1,XXX2,whatever,unique=2 
XXX1,whatever,unique=1 
+0

Спасибо! Почти готово! Не могли бы вы обратиться к моему вопросу? Просто опубликуйте обновление. – user706838

+0

@eualin сделал это за вас. – Kent

Смежные вопросы