我想从文件中删除一个或多个特定的行号。如何使用sed做到这一点?


当前回答

我想提出一个关于awk的概括。

当文件由固定大小的块组成时 要删除的行对于每个块都是重复的, Awk可以很好地以这种方式工作

awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print  $0}'
 OriginFile.dat > MyOutputCuttedFile.dat

在这个例子中,块的大小是2000,我想打印行[1..713]和[1026. 1029]。

NR是awk用来存储当前行号的变量。 %给出两个整数除法的余数(或模量); 在这里,我们在变量nl中写入当前块中的行号。(见下文) ||和&&是逻辑运算符OR和and。 打印$0写入整行


Why ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
  +1   We add again 1 because we want to restore the desired order.

+-----+------+----------+------------+
| NR  | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
|  1  |  1   |    0     |     1      |
|  2  |  2   |    1     |     2      |
|  3  |  0   |    2     |     3      |
|  4  |  1   |    0     |     1      |
+-----+------+----------+------------+

其他回答

我想提出一个关于awk的概括。

当文件由固定大小的块组成时 要删除的行对于每个块都是重复的, Awk可以很好地以这种方式工作

awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print  $0}'
 OriginFile.dat > MyOutputCuttedFile.dat

在这个例子中,块的大小是2000,我想打印行[1..713]和[1026. 1029]。

NR是awk用来存储当前行号的变量。 %给出两个整数除法的余数(或模量); 在这里,我们在变量nl中写入当前块中的行号。(见下文) ||和&&是逻辑运算符OR和and。 打印$0写入整行


Why ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
  +1   We add again 1 because we want to restore the desired order.

+-----+------+----------+------------+
| NR  | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
|  1  |  1   |    0     |     1      |
|  2  |  2   |    1     |     2      |
|  3  |  0   |    2     |     3      |
|  4  |  1   |    0     |     1      |
+-----+------+----------+------------+

还有awk

awk 'NR!~/^(5|10|25)$/' file
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$ 

如果你想删除第5到第10行和第12行:

sed -e '5,10d;12d' file

这将把结果打印到屏幕上。如果你想把结果保存到同一个文件:

sed -i.bak -e '5,10d;12d' file

这将把未修改的文件存储为file.bak,并删除给定的行。

注意:行号从1开始。文件的第一行是1,而不是0。

您可以删除特定的单行及其行号

sed -i '33d' file

这将删除33行号上的行并保存更新后的文件。