【问题标题】:How to delete first 10 lines containing certain string?如何删除包含特定字符串的前 10 行?
【发布时间】:2017-07-12 07:13:25
【问题描述】:

假设我有一个具有这种结构的文件

1001.txt
1002.txt
1003.txt
1004.txt
1005.txt
2001.txt
2002.txt
2003.txt
...

现在如何删除以“2”开头的前 10 个行号?可能有超过 10 行以 '2' 开头。

我知道我可以使用grep '^2' file | wc -l 来查找以“2”开头的行数。但是如何删除行的前10个数字?

【问题讨论】:

标签: linux shell


【解决方案1】:

您可以通过这个 Perl 单线器来管理您的列表:

perl -p -e '$_="" if (/^2/ and $i++ >= 10)'

【讨论】:

  • 如何指定要检查的文件?
【解决方案2】:

awk 中的另一个。使用值 2 作为您的数据进行测试只有 3 行相关数据。将后 2 替换为 10。

$ awk '/^2/ && ++c<=2 {next} 1' file
1001.txt
1002.txt
1003.txt
1004.txt
1005.txt
2003.txt
.
.
.

解释:

$ awk '/^2/ && ++c<=2 {   # if it starts with a 2 and counter still got iterations left
    next                  # skip to the next record
} 1                       # (else) output
' file

【讨论】:

  • 或者,反转逻辑:awk '!/^2/ || ++c&gt;10'
  • 我和你一样得到了结果。但文件中没有任何变化。
  • 它不会更改源文件,您需要将输出重定向到新文件。更安全。
  • 怎么办? &gt; new_file ?
  • 是的。 awk '...' file &gt; new_file
【解决方案3】:

awk 替代:

awk '{ if (substr($0,1,1)=="2") { count++ } if ( count > 10 || substr($0,1,1)!="2") { print $0 } }' filename

如果该行的第一个字符是 2,则增加一个计数器。然后仅在 count 大于 10 或第一个字符不是 2 时打印该行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 2021-03-17
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2016-01-05
    相关资源
    最近更新 更多