Bash 删除按id匹配模式的行

Bash 删除按id匹配模式的行,bash,shell,Bash,Shell,我有以下包含n行的文件: 我想删除以m结尾的行。在本例中,输出为: >name.1_i4_n >name.1_i4_n ... 请注意,我已经删除了i2,因为它有两条记录,其中一条以m结尾。与i1相同 有什么帮助吗?我想保持它的简单性,只需要一行代码。 这就是我到目前为止所做的: $ grep "i._.*." < input.txt | sort -k 2 -t "_" | cut -d'_' -f1,2,4 >name.1_i1_m >name.1_i1_n

我有以下包含n行的文件:

我想删除以
m
结尾的行。在本例中,输出为:

>name.1_i4_n
>name.1_i4_n
...
请注意,我已经删除了
i2
,因为它有两条记录,其中一条以
m
结尾。与
i1
相同

有什么帮助吗?我想保持它的简单性,只需要一行代码。 这就是我到目前为止所做的:

$ grep "i._.*." < input.txt | sort -k 2 -t "_" | cut -d'_' -f1,2,4
>name.1_i1_m
>name.1_i1_n
>name.1_i1_n
>name.1_i2_m
>name.1_i2_n
>name.1_i4_n
>name.1_i4_n
>name.1_i7_m
...
$grep“i.......*”名称1_i1_m
>名称1\u i1\n
>名称1\u i1\n
>名称1_i2_m
>名称1\u i2\n
>名称1\u i4\n
>名称1\u i4\n
>名称1_i7_m
...
删除以m结尾的行:

使用awk和2运行另一个处理ids的解决方案:

$ awk 'BEGIN { FS="_" }  # set delimiter
NR==FNR {                # on the first run 
    if($0~/m$/)          # if it ends in an m
        d[$2]            # make a del array entry of that index
    next
}
($2 in d==0)' file file  # on the second run don't print if index in del array
>name.1_i4_xyz_n
>name.1_i4_xyz_n
一行程序版本:

$ awk 'BEGIN{FS="_"}NR==FNR{if($0~/m$/)d[$2];next}($2 in d==0)' file file
要删除以m结尾的行,请执行以下操作:

使用awk和2运行另一个处理ids的解决方案:

$ awk 'BEGIN { FS="_" }  # set delimiter
NR==FNR {                # on the first run 
    if($0~/m$/)          # if it ends in an m
        d[$2]            # make a del array entry of that index
    next
}
($2 in d==0)' file file  # on the second run don't print if index in del array
>name.1_i4_xyz_n
>name.1_i4_xyz_n
一行程序版本:

$ awk 'BEGIN{FS="_"}NR==FNR{if($0~/m$/)d[$2];next}($2 in d==0)' file file

您可以使用
awk
,如下所示:

awk -F_ '{if(/m$/) a[$2]; else rows[++n]=$0}
END{for (i=1; i<=n; i++) {split(rows[i], b, FS); if (!(b[2] in a)) print}}' file

>name.1_i4_xyz_n
>name.1_i4_xyz_n
awk-F{if(/m$/)a[$2];else行[++n]=$0}

END{for(i=1;i您可以使用
awk
,如下所示:

awk -F_ '{if(/m$/) a[$2]; else rows[++n]=$0}
END{for (i=1; i<=n; i++) {split(rows[i], b, FS); if (!(b[2] in a)) print}}' file

>name.1_i4_xyz_n
>name.1_i4_xyz_n
awk-F{if(/m$/)a[$2];else行[++n]=$0}

END{for(i=1;i如果
i..
部分没有出现在任何其他列中,则可以使用

grep -vFf <(grep -E 'm$' file | cut -d _ -f 2) file

grep-vFf如果
i.
部分没有出现在任何其他列中,您可以使用

grep -vFf <(grep -E 'm$' file | cut -d _ -f 2) file
grep-vFf另一个awk提案

awk '/_i4/&&!/_m$/' filterm.awk

>name.1_i4_xyz_n
>name.1_i4_xyz_n
另一个awk提案

awk '/_i4/&&!/_m$/' filterm.awk

>name.1_i4_xyz_n
>name.1_i4_xyz_n

是的,它们都以
开头,或者说是以你想要的另一种方式开始?是的,它们都以
开头,或者是以你想要的另一种方式开始?但是所有包含
i1
的行也应该被删除,因为有一行的id是
i1
,以
m
结尾(与
i2
相同)但是包含
i1
的所有行也应该删除,因为有一行的id是
i1
,以
m
结尾(与
i2
相同)@anubhava这就是我写的原因。如果I…部分没有出现在任何其他列中«。@anubhava这就是我写的原因。»如果I…部分没有出现在任何其他列中«。