如何删除基于行号包含在另一个文件中的文件中的特定行? 我知道如何通过只提供他们在命令行删除特定行,但我不知道如何删除基于包含在另一个文件中的行数的具体线路。 含有的行号的文件是以下格式:
15768
15775
15777
15782
15784
15789
15791
15798
15800
15807
15809
15815
15817
15824
15826
有2073行总觉得我需要删除。 我试着摸索如何做到这一点,虽然我没能类似这样的例子。
谢谢你的帮助。
如何删除基于行号包含在另一个文件中的文件中的特定行? 我知道如何通过只提供他们在命令行删除特定行,但我不知道如何删除基于包含在另一个文件中的行数的具体线路。 含有的行号的文件是以下格式:
15768
15775
15777
15782
15784
15789
15791
15798
15800
15807
15809
15815
15817
15824
15826
有2073行总觉得我需要删除。 我试着摸索如何做到这一点,虽然我没能类似这样的例子。
谢谢你的帮助。
假定行号被删除是在一个文件中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
命令读取删除命令和应用操作的大数据文件。
用awk:
awk 'FNR==NR{a[$0];next} !(FNR in a)' f1 f2
ed
是标准的编辑器。
下面就来驱动可能性ed
做你的编辑(到位):
#!/bin/bash
ed -s file < <(
while read line; do
[[ $line =~ ^[[:digit:]]+$ ]] || continue
printf "%d d\n" "$line"
done < lines
echo "wq"
)
这将打开该文件file
与ed
,读取文件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
因人而异。