Sed сжать множественное вхождение слова - PullRequest
0 голосов
/ 22 мая 2018

У меня есть текстовый файл со строками, как показано ниже:

this is the code ;rfc1234;rfc1234
this is the code ;rfc1234;rfc1234;rfc1234;rfc1234

Как мне сжать повторяющиеся слова в файле до одного слова, как показано ниже:

this is the code ;rfc1234
this is the code ;rfc1234

Я попробовал 'tr'команда, но она ограничена только сжатием символов

Ответы [ 6 ]

0 голосов
/ 23 мая 2018

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

sed -r ':a;s/(\S+)\1+/\1/g;ta' file

Регулярное выражение повторяется до тех пор, пока не останется только первый шаблон.

0 голосов
/ 23 мая 2018
sed 's/\(;[^;]*\).*/\1/'  file
0 голосов
/ 22 мая 2018

Я начал играть с s/(.+)\1/\1/g.Казалось, что он работает с Perl (даже нашел is_is_), но не совсем меня там:

$ perl -pe 's/(.+)\1+/\1/g' file
this the code ;rfc1234
this the code ;rfc1234;rfc1234
0 голосов
/ 22 мая 2018

с sed для произвольных повторяющихся строк с префиксом ;

$ sed -E 's/(;[^;]+)(\1)+/\1/g' file

или, если вы хотите удалить все после первого токена, не проверяя, соответствуют ли они предыдущему или нет

$ sed -E 's/(\S);.*/\1/' file

Объяснение

(;[^;]+) - захват строки, начинающейся с точки с запятой
(\1)+, за которой следует одна и та же захваченная строка один или несколько раз
/\1/g заменить всю цепочку одним экземпляром и повторить

0 голосов
/ 22 мая 2018

После awk может помочь здесь.Он будет искать все элементы в последнем столбце вашего Input_file и сохранит в нем только уникальные значения.

awk '{num=split($NF,array,";");for(i=1;i<=num;i++){if(!array1[array[i]]++){val=val?val ";" array[i]:array[i]}};NF--;print $0";"val;val="";delete array;delete array1}'   Input_file

Теперь добавляется также форма решения с одним вкладышем.

awk '
{
  num=split($NF,array,";");
  for(i=1;i<=num;i++){
    if(!array1[array[i]]++){
      val=val?val ";" array[i]:array[i]}
};
  NF--;
  print $0";"val;
  val="";
  delete array;
  delete array1
}'   Input_file

Объяснение:

awk '
{
  num=split($NF,array,";");             ##Creating a variable named num whose value is length of array named array, which is created on last field of line with ; as a delimiter.
  for(i=1;i<=num;i++){                  ##Starting a for loop from i=1 to till value of num each time increment i as 1.
    if(!array1[array[i]]++){            ##Chrcking here a condition if array named array1 index is value of array[i] is NOT coming more than 1 value then do following.
      val=val?val ";" array[i]:array[i]}##Creating a variable named val here whose value is array[i] value and keep concatenating its own value of it.
};
  NF--;                                 ##Reducing the value of NF(number of fields) in current line to remove the last field from it.
  print $0";"val;                       ##Printing the current line(without last field) ; and then value of val here.
  val="";                               ##Nullifying variable val here.
  delete array;                         ##Deleting array named array here.
  delete array1                         ##Deleting array named array1 here.
}'  Input_file                          ##Mentioning Input_file name here.
0 голосов
/ 22 мая 2018

Вы можете использовать следующую команду для достижения этой цели: -

 echo "this is the code ;rfc1234;rfc1234" | sed 's/rfc1234//2g'

 echo "this is the code ;rfc1234;rfc1234;rfc1234;rfc1234" | sed 's/rfc1234//2g'

или

  sed 's/rfc1234//2g' yourfile.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...