如何在VIM中删除包含全部1-4值的前缀对应所有行
解决方案:保留未集齐全部1-4值的前缀行
可以用awk命令高效实现这个需求,它能方便地按前缀分组统计数字,再筛选出符合条件的行。
核心命令
假设你的输入文件名为input.txt,执行以下命令:
BEGIN { FS=":" } NR == FNR { nums[$1][$2] = 1; next } ! (nums[$1]["1"] && nums[$1]["2"] && nums[$1]["3"] && nums[$1]["4"]) ' input.txt input.txt
命令解释
BEGIN { FS=":" }:把每行按冒号分割,提取前缀(比如abcd)和数字(比如1)- 第一次遍历文件(
NR == FNR):用二维数组nums记录每个前缀对应的数字,比如nums["abcd"]["1"] = 1表示abcd有数字1 - 第二次遍历文件:检查当前行的前缀是否同时拥有1、2、3、4四个数字,只要缺一个,就输出该行
直接修改原文件
如果需要直接替换原文件内容,可以通过临时文件中转:
awk 'BEGIN { FS=":" } NR == FNR { nums[$1][$2] = 1; next } ! (nums[$1]["1"] && nums[$1]["2"] && nums[$1]["3"] && nums[$1]["4"])' input.txt input.txt > temp.txt && mv temp.txt input.txt
可选思路
也可以用sort、uniq结合grep实现,但步骤更繁琐:先按前缀分组统计数字数量,筛选出数量不足4的前缀,再提取这些前缀的行。相比之下awk的方法一步到位,更适合这类场景。
内容的提问来源于stack exchange,提问作者Ujjwal Gupta
相关产品推荐
相关产品推荐

