Bash 删除按id匹配模式的行
我有以下包含n行的文件: 我想删除以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
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…部分没有出现在任何其他列中«。