首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sed压缩词的多次出现

sed压缩词的多次出现
EN

Stack Overflow用户
提问于 2018-05-22 15:06:28
回答 6查看 246关注 0票数 2

我有如下所示的文本文件:

代码语言:javascript
运行
复制
this is the code ;rfc1234;rfc1234
this is the code ;rfc1234;rfc1234;rfc1234;rfc1234

如何将文件中的重复单词压缩为单个单词,如下所示:

代码语言:javascript
运行
复制
this is the code ;rfc1234
this is the code ;rfc1234

我试过“tr”命令,但它仅限于压缩字符

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-05-22 21:37:44

代码语言:javascript
运行
复制
sed 's/\(;[^;]*\).*/\1/'  file
票数 0
EN

Stack Overflow用户

发布于 2018-05-22 15:51:59

对于以sed为前缀的任意重复字符串,则为;

代码语言:javascript
运行
复制
$ sed -E 's/(;[^;]+)(\1)+/\1/g' file

或者,如果您想删除第一个令牌之后的所有内容,而不检查它们是否与前面的令牌匹配

代码语言:javascript
运行
复制
$ sed -E 's/(\S);.*/\1/' file

解释

(;[^;]+)是捕获以分号开头的字符串。 (\1)+后面跟着同一个捕获的字符串一次或多次 /\1/g用一个实例替换整个链,然后重复

票数 3
EN

Stack Overflow用户

发布于 2018-05-22 15:33:53

在这里跟踪awk可能会有所帮助。它将查找Input_file最后一栏中的所有项,并且只保留其中唯一的值。

代码语言:javascript
运行
复制
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

现在也加入了一种非单一的线性解决方案。

代码语言:javascript
运行
复制
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

解释:

代码语言:javascript
运行
复制
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.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50470988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档