如何删除使用AWK特定行基于的Sed /在另一个文件中的内容(How can I delete sp

2019-10-19 21:55发布

如何删除基于行号包含在另一个文件中的文件中的特定行? 我知道如何通过只提供他们在命令行删除特定行,但我不知道如何删除基于包含在另一个文件中的行数的具体线路。 含有的行号的文件是以下格式:

15768
15775
15777
15782
15784
15789
15791
15798
15800
15807
15809
15815
15817
15824
15826

有2073行总觉得我需要删除。 我试着摸索如何做到这一点,虽然我没能类似这样的例子。

谢谢你的帮助。

Answer 1:

假定行号被删除是在一个文件中to-be-deleted并且数据是在big-data-file ,然后,使用bash 进程替换 :

 sed -f <(sed 's/$/d/' to-be-deleted) big-data-file > smaller-data-file

sed 's/$/d'命令行号转换成sed删除操作。 外sed命令读取删除命令和应用操作的大数据文件。



Answer 2:

用awk:

awk 'FNR==NR{a[$0];next} !(FNR in a)' f1 f2


Answer 3:

ed是标准的编辑器。

下面就来驱动可能性ed做你的编辑(到位):

#!/bin/bash

ed -s file < <(
    while read line; do
        [[ $line =~ ^[[:digit:]]+$ ]] || continue
        printf "%d d\n" "$line"
    done < lines
    echo "wq"
)

这将打开该文件fileed ,读取文件lines包含行号,检查每个读线确实是一个数字,然后给ed命令来删除这个数字,而当一切完成后要求ed写和退出wq

你可能想更换[[ $line =~ ^[[:digit:]]+$ ]] || continue [[ $line =~ ^[[:digit:]]+$ ]] || continue一行:

[[ $line =~ ^[[:digit:]]+$ ]] || { printf >&2 "*** WARNING: Line %d not deleted\n" "$line"; continue; }

所以当无效线路都存在于文件中警告lines


请务必阅读格伦jackmann的评论:

我听说过的一些旧的实现ed不接受wq作为单个命令: printf "%s\n" wq

因人而异。



文章来源: How can I delete specific lines using awk/sed based on the contents of another file