sed или awk - удаление строк между шаблонами - PullRequest
2 голосов
/ 16 июня 2011

У меня есть CSV-файл с такими строками:

AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC.DDD,C-name,num1,num2,num3
EEE.FFF.GGGG,E-name,num1,num2,num3    
HHH.H-name,num1,num2,num3
...

Некоторые строки имеют один идентификатор (например, AAA);у некоторых есть два (как CCC);некоторые имеют три или более (например, EEE).И некоторые идентификаторы не три символа.Мне нужно удалить все, кроме первого идентификатора, из каждой строки строки (например, первый период и все, что следует после него, удаляется до первой запятой), получая следующее:

AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3
HHH,H-name,num1,num2,num3
...

IЯ пробовал несколько методов замены шаблона, но меня сбивают с толку.У кого-нибудь есть синтаксис, который мне нужен?

Ответы [ 3 ]

2 голосов
/ 16 июня 2011

Просто удалите все между точкой и первым двоеточием. Для файла

$ cat foo
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC.DDD,C-name,num1,num2,num3
EEE.FFF.GGGG,E-name,num1,num2,num3    
HHH.H-name,num1,num2,num3

используйте эту команду sed:

$ sed 's/\.[^,]*//' foo
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3    
HHH,num1,num2,num3

Однако он удалит H в последней строке. Однако в вашем примере это опечатка.

2 голосов
/ 16 июня 2011
sed 's/^\([^.]\{1,\}\)[^,]*/\1/'
1 голос
/ 16 июня 2011

Использование perl

$ perl -pe 's/\.[A-Z.]*?,/,/' input
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3
HHH.H-name,num1,num2,num3

СЭД

$ sed 's/\.[A-Z.]*,/,/' input
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3
HHH.H-name,num1,num2,num3

и awk

$ awk '/\./{sub(/\.[A-Z.]*,/, ",", $0)}{print}' input
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3
HHH.H-name,num1,num2,num3
...