从文本文件中删除开头包含字符串并结尾包含字符串的行 - 并保留一个

从文本文件中删除开头包含字符串并结尾包含字符串的行 - 并保留一个

我花了一段时间才把这句话说得最好。

问题一:

有没有办法在文本文件中查找开头和结尾具有相同字符串的行?

开始和结束字符串不一定彼此相同。

两个字符串之间的文本的字符数或连字符数不一致。

值得注意的字符串之间有一个连字符(我将其添加到我的大文本文件中)。

例如:

文件:

  AAAAA-tjhut-ghyut-FILE1.txt
  BBB-fhuj-dnbhg-frt76-FILE2.txt
  AAAAA-ghtujukr-hgute7gr-xhyutt-FILE1.txt
  AAAAA-VGYT-4d7tt-xhyutt-FILE1.txt
  CCCC-fjuk-dryy-fhuj-FILE3.txt

要检测的线路:

  AAAAA-tjhut-ghyut-FILE1.txt
  AAAAA-ghtujukr-hgute7gr-xhyutt-FILE1.txt
  AAAAA-VGYT-4d7tt-xhyutt-FILE1.txt

问题2:

有没有办法从上面删除除开头和结尾处包含重复字符串的行之外的所有行?

前:

  AAAAA-tjhut-ghyut-FILE1.txt
  AAAAA-ghtujukr-hgute7gr-xhyutt-FILE1.txt
  AAAAA-VGYT-4d7tt-xhyutt-FILE1.txt

后:

  AAAAA-tjhut-ghyut-FILE1.txt

非常感谢您的任何建议。

注意:我认为使用第一个连字符和最后一个连字符的出现可以用来定位重复的字符串。

答案1

问题一: 想法:

  • 循环两次
  • 在第一个循环提取索引(第 1 列和最后一列)
  • 计算索引出现的次数
  • 第二个循环再次迭代所有行(存储在第一个循环内)
  • 再次从当前行中提取索引
  • 如果索引计数 > 1 则打印

这是我的示例,存储为example.awk

#!/usr/bin/awk -f
BEGIN {
  # field separator
  FS="-";
}
{
  # remember row for second loop
  allRows[rowCount++]=$0;

  # relevant columns
  colFirst=$1;
  colLast=$NF;

  # create combined index: first column, space, last column
  # count occurences of combined index
  indexes[colFirst" "colLast]++;
}
END {

  # loop through all input rows
  for(currentRow in allRows) {

    # extract combined index from current row
    arrLen = split(allRows[currentRow],splitted,"-");
    colFirst=splitted[1];
    colLast=splitted[arrLen];

    # output row  if index count of current row > 1
    if (indexes[colFirst" "colLast] > 1) {
    # index count > 1, so print
      print allRows[currentRow];
    }
  }
}

如果输入文件名为input.txt

awk -f example.awk < input.txt

我的输出:

AAAAA-tjhut-ghyut-FILE1.txt
AAAAA-ghtujukr-hgute7gr-xhyutt-FILE1.txt
AAAAA-VGYT-4d7tt-xhyutt-FILE1.txt

问题2: 据我了解,您只想保留第一行:

awk -f example.awk < input.txt | head -n 1

head:输出文件的第一部分

-n 1:打印前 NUM 行,所以只有 1

相关内容