【问题标题】:How to delete lines starting with certain numbers in a file?如何删除文件中以某些数字开头的行?
【发布时间】:2020-06-29 18:20:11
【问题描述】:

这里的问题很简单,但我有点卡住了。

假设我有一个 20 行 4 列的文件。第一列是一个数字(1 到 20)。

我还有一个文件,里面有几个像这样的数字

1
4
19

现在,我如何删除以第二个文件中的数字开头的行(在第一个文件中)。我的主要问题是,如果我执行 sed,数字 1 将变为 10、11、12 等等。我怎样才能以正确的方式做到这一点?

非常感谢!

编辑:示例

文件1

1       a       a       a
2       b       b       b
3       c       c       c
4       d       d       d
5       e       e       e
6       f       f       f
7       g       g       g
8       h       h       h
9       i       i       i
10      j       j       j
11      k       k       k
12      l       l       l
13      m       m       m
14      n       n       n
15      o       o       o
16      p       p       p
17      q       q       q
18      r       r       r
19      s       s       s
20      t       t       t

文件2

1
4
19

我想要的结果:

2       b       b       b
3       c       c       c
5       e       e       e
6       f       f       f
7       g       g       g
8       h       h       h
9       i       i       i
10      j       j       j
11      k       k       k
12      l       l       l
13      m       m       m
14      n       n       n
15      o       o       o
16      p       p       p
17      q       q       q
18      r       r       r
20      t       t       t

【问题讨论】:

    标签: regex linux bash sed line


    【解决方案1】:

    您可以为此使用awk

    awk 'FNR==NR{a[$1]; next} !($1 in a)' file2 file1
    2       b       b       b
    3       c       c       c
    5       e       e       e
    6       f       f       f
    7       g       g       g
    8       h       h       h
    9       i       i       i
    10      j       j       j
    11      k       k       k
    12      l       l       l
    13      m       m       m
    14      n       n       n
    15      o       o       o
    16      p       p       p
    17      q       q       q
    18      r       r       r
    20      t       t       t
    

    awk 命令的分解

    FNR == NR {                  # While processing the file2
      a[$1]                      # store the 1st field in an array
      next                       # move to next record
    }
                                 # while processing the file1
    !($1 in a)                   # print a row from file1 if 1st field is not in array 'a'
    

    【讨论】:

    • 感谢您的评论!我不确定我是否理解这应该如何工作......我对 awk 还不满意。我会做一些研究并尝试一些代码!
    • 如果您提供来自 2 个相关文件的输入数据样本,那么我可以用更多详细信息更新答案。
    • 我编辑了我的原始帖子!我的第一条评论仅仅是因为我还不了解有关 awk 的所有细节。
    • 如果有不清楚的地方,您可以随时寻求更多帮助。我添加了有关使用的 awk 命令的详细信息。我还建议阅读有关 awk 的好教程。它比sed 简单得多,对于这种情况,我是否也可以添加更有效的方法。
    • 谢谢!我又试了一次,它就像一个魅力。您的解释也确实帮助我理解了如何使用该命令!
    【解决方案2】:

    您可以使用 sed 创建删除给定行的 sed 脚本:

     sed 's=^=/^=;s=$=\\s/d=' numbers
    

    它创建以下 sed 脚本:

    /^1\s/d
    /^4\s/d
    /^19\s/d
    

    即如果该行以 1、4 或 19 开头,后跟空格,则删除该行。

    您可以直接将其通过管道传递给 sed 来运行它:

    sed 's=^=/^=;s=$=\\s/d=' numbers | sed -f- input-file
    

    【讨论】:

    • 这很完美!非常感谢!我将不得不多学习 sed,因为我不能完全理解这行 's=^=/^=;s=$=\\s/d=' 但至少我知道我可以做到!跨度>
    • @Yarmiz:它只是将/^ 放在每行的开头,将\s/d 放在每行的末尾。
    • 好的,我现在明白了。再次感谢!
    猜你喜欢
    • 2021-02-12
    • 1970-01-01
    • 2010-12-16
    • 2013-03-27
    • 2017-09-27
    • 1970-01-01
    • 2020-10-31
    • 2012-09-30
    • 2019-11-15
    相关资源
    最近更新 更多