awk:从长线中删除短线

awk:从长线中删除短线,awk,Awk,我有一个很长的文本字符串文件,按长度排序。我需要做的是找到包含在长线中的任何短线,将长线拆分为两条短线,并保留原始短线不变,如下所示: input: here is an example of a long line an example of output: here is a long line an example of 您尚未发布足够的数据集,我们无法发布完整的解决方案,但以下是一些帮助您开始的内容: $ awk ' NR==FNR{ a[$0]++; next } {

我有一个很长的文本字符串文件,按长度排序。我需要做的是找到包含在长线中的任何短线,将长线拆分为两条短线,并保留原始短线不变,如下所示:

input:
here is an example of a long line
an example of

output:
here is
a long line
an example of

您尚未发布足够的数据集,我们无法发布完整的解决方案,但以下是一些帮助您开始的内容:

$ awk '
NR==FNR{
  a[$0]++;
  next
}
{
  for(x in a) 
    if(x!=$0 && index($0,x)>0) {
      sub(x FS,"\n")
    }
}1' file file
here is 
a long line
an example of
  • 我们正在对文件进行两次传递。在第一个过程中,读取这些行并将它们存储为数组中的键(重复的行将存储为一个键)
  • 在第二步中,我们遍历数组,如果关键字不等于当前行,而是当前行的子集,则用换行符替换较小的单词
如果存在多种可能性怎么办?例如,如果输入是
A B C D E
B C
C D
,您希望删除哪一个较短的?如果您给出真实数据示例以及为什么要取出这些数据,会更好。正如Gassa所写,有多种可能得到不同的答案。我试图做的是为任意短语(散文)构建一个vim语法文件。问题是,这些短语之间有很多部分重叠。不包含/嵌套,但部分重叠,这意味着第一个短语高亮显示,但第二个短语未高亮显示。很明显,没有办法进行重叠高亮显示,所以我唯一的选择是消除重叠。我明白你所说的多种可能性,但因为这只是语法突出显示,所以不是什么大问题。无论哪种方式,所有的单词都会被突出显示。你知道,现在我已经写出来了,我发现我错说了我的需要。我需要找到线之间的重叠,而不是嵌套线。这里有更多的例子
第一个
第一个
将不会正确突出显示“第一个”――只有“第一个”。
焦点在别处
在“焦点在别处”中,只有“焦点”将突出显示
三部曲的第三部分
三部曲的一部分
在“三部曲的第三部分”中,“第三部分”和“三部曲”突出显示,但不显示“of”。第二个短语不匹配。在这一点上,我很困惑。我应该研究ngrams吗?我应该澄清一下,我正在使用sed脚本将列表导出到.vim文件。当我继续思考这个问题时,我不认为把短语分开是突出文本的一种有意义的方式。我将把它分解成一个新的,vim语法特定的问题。谢谢你的帮助!