2015-07-24 4 views
0

У меня есть файл с разделителями с запятой.Как обработать вложенные разделители в одном файле в unix

И одно из полей в файле разделено на трубы.

Пример.

field-1;field-2;value-1|value-2|value-3;field-4;field-5 

Здесь field-3 нет ничего, кроме труб, разделенных значений.

Теперь мое требование заключается в том, что если есть несколько значений в field-3,

Я только сохранить первое значение. Отбросьте что-нибудь после первого канала в этом поле.

т.е. я хочу сохранить только первое значение в field-3, как показано ниже

field-1;field-2;value-1;field-4;field-5 

Можете ли вы сказать мне, как я могу добиться этого с помощью СЭД/AWK?

+0

Возможно, вам нужен текстовый редактор с возможностью поиска и замены регулярных выражений; просто найдите '.. *;' и замените его ';'. – legends2k

ответ

2
sed 's/[|][^;]*//g' YourFile 
  • его удалить (заменить ничем) любое значение после того, как (включая его) | ([|] рисунка) до тех пор, пока не ; ([^;] рисунка) и для каждой встречаемости (вариант g)
  • Предполагая | только сепаратор, а не часть поданного значения (например, в строке)
+0

Это сработало для меня. Спасибо. – Mahesh

0

Один из способов:

$ x='field-1;field-2;value-1|value-2|value-3;field-4;field-5' 
$ echo $x | awk -F";" '{gsub(/\|.*/,"",$3);}1' OFS=";" 
field-1;field-2;value-1;field-4;field-5 
$ 
+0

вам нужен цикл для обработки каждого поля в этом случае. вы также могли бы непосредственно работать над $ 0, адаптируя регулярное выражение – NeronLeVelu

0

Это может работать для вас (GNU СЭД):

sed -r 's/^(([^;]*;){2}[^|;]*)[^;]*/\1/' file 

Это соответствует первые три поля и заменяет его на первых двух полей и первое значение в третьем поле.

+0

* одно из полей в файле *, поэтому не только или специфично 3-е поле, как в примере, который я представляю – NeronLeVelu