保留与字符串搜索匹配的第一行,并删除所有匹配相同字符串的后续行

保留与字符串搜索匹配的第一行,并删除所有匹配相同字符串的后续行

我试图保留与字符串搜索匹配的第一行并删除所有与相同字符串匹配的后续行。

有任何想法吗?

$ cat example-input.txt
Question one|some other text
Question two|dfgdfgdfgvd
Question one| dfg dfg dfg dfg
Question three|aa bb cc dd eee
Question one|zz aa BB yy qq
Question four|zz xx yy qq

cat example-input.txt | someuniqprogramoroptions "Question one" > example-output.txt

$ cat example-output.txt
Question one|some other text
Question two|dfgdfgdfgvd
Question three|aa bb cc dd eee
Question four|zz xx yy qq
$

更新:感谢 awk 代码 G-Man,你真厉害!

$ cat example-input.txt | ./awk-firstlines-only.sh
Question one|some other text
Question two|dfgdfgdfgvd
Question three|aa bb cc dd eee
Question four|zz xx yy qq

答案1

根据您给出的示例,此awk命令将产生您要求的输出:

awk '
    {
        i = index($0, "|")
        if (i == 0) {
                print "Error: line [" $0 "] does not have a \"|\" character."
        } else {
                prefix = substr($0, 1, i-1)
                if (++count[prefix] == 1) print
        }
    }'

前两行代码验证每个输入行是否包含|。下一行提取第一个字符之前的字符串|(例如,“问题一”)。  count是一个关联数组,我们用它来计算每个前缀出现的次数。如果这是 #1(即第一次出现),则打印该行;否则,不打印任何内容。

答案2

如果第一部分具有固定长度,则另一种简便解决方案是将命令uniq与以下内容相结合sort

cat example-input.txt | sort | uniq -W 13

对于您的示例来说,这不是很合适,因为您的文件长度可变并且将被重新排序,但当您不想编写脚本时,这对于类似的工作非常方便。

答案3

perl -nle' /Question one/ and ($count++ or print) or print' example-input.txt

...根据 OP 示例的输入将产生其输出。

相关内容