如何删除文件中某些数字开头的行?

时间:2015-07-07 16:15:45

标签: linux bash file sed lines

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

假设我有一个包含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

file2的

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

2 个答案:

答案 0 :(得分:6)

您可以使用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'

答案 1 :(得分:3)

您可以使用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