我有一个包含如下行的文件。如果一组行中的任何行包含关键字 SEDS2-TOP,我想从文件中删除一组行。每组行由空行分隔。
0.00 600.00 2214.28 785.71 1.00000 SEDS1-BOTTOM
0.00 600.00 2214.28 785.71 1.00000 SEDS1-TOP
0.00 600.00 1500.00 0.00 1.00000 WATER-BOTTOM
0.00 600.00 3446.97 1757.08 1.00000 SEDS2-TOP
0.00 600.00 2218.64 790.51 1.00000 SEDS1-BOTTOM
0.00 600.00 2218.64 790.51 1.00000 SEDS1-TOP
0.00 0.00 600.00 1500.00 1.00000 WATER-BOTTOM
0.00 400.00 2004.28 785.71 1.00000 SEDS1-BOTTOM
0.00 300.00 2254.28 785.71 1.00000 SEDS1-TOP
0.00 600.00 1600.00 0.00 1.00000 WATER-BOTTOM
0.00 600.00 3446.97 1757.08 1.00000 SEDS2-TOP
0.00 600.00 1500.00 0.00 1.00000 WATER-BOTTOM
0.00 600.00 3446.97 1757.08 1.00000 SEDS2-TOP
输出文件应具有的示例
0.00 600.00 2214.28 785.71 1.00000 SEDS1-BOTTOM
0.00 600.00 2214.28 785.71 1.00000 SEDS1-TOP
0.00 600.00 1500.00 0.00 1.00000 WATER-BOTTOM
0.00 400.00 2004.28 785.71 1.00000 SEDS1-BOTTOM
0.00 300.00 2254.28 785.71 1.00000 SEDS1-TOP
0.00 600.00 1600.00 0.00 1.00000 WATER-BOTTOM
你可以这样做awk
使用 3 规则和END
规则。可以写成如下:
awk 'NF==0 { # empty line
for (i in a) # for each line in array a
print i # output line (index)
if (i in a) # if lines exists
print "" # output blank line at end
delete a # clear a array
del=0 # set delete group flag 0
next # get next record
}
/SEDS2-TOP/ { # SEDS2-TOP matched in record
del=1 # set delete group flag 1
delete a # delete array a
next # get next records
}
del==0 { # del group flag is zero
a[$0]++ # add line as index to array a
}
END { # END rule - process last group of lines
if (del==0) { # if del group flag not set
for (i in a) # loop over lines in a
print i # output line (index)
print "" # with newline after
}
}' rowsets
使用/输出示例
使用数据文件作为输入,您可以简单地选择复制上面的脚本(并更改包含行集的文件名rowsets
到您拥有的任何内容,然后用鼠标中键将文件粘贴到终端的目录中,例如
$ awk 'NF==0 { # empty line
> for (i in a) # for each line in array a
> print i # output line (index)
> if (i in a) # if lines exists
> print "" # output blank line at end
> delete a # clear a array
> del=0 # set delete group flag 0
> next # get next record
> }
> /SEDS2-TOP/ { # SEDS2-TOP matched in record
> del=1 # set delete group flag 1
> delete a # delete array a
> next # get next records
> }
> del==0 { # del group flag is zero
> a[$0]++ # add line as index to array a
> }
> END { # END rule - process last group of lines
> if (del==0) { # if del group flag not set
> for (i in a) # loop over lines in a
> print i # output line (index)
> print "" # with newline after
> }
> }' rowsets
0.00 600.00 1500.00 0.00 1.00000 WATER-BOTTOM
0.00 600.00 2214.28 785.71 1.00000 SEDS1-BOTTOM
0.00 600.00 2214.28 785.71 1.00000 SEDS1-TOP
0.00 400.00 2004.28 785.71 1.00000 SEDS1-BOTTOM
0.00 300.00 2254.28 785.71 1.00000 SEDS1-TOP
0.00 600.00 1600.00 0.00 1.00000 WATER-BOTTOM
保留行顺序
如果需要保留行顺序,则可以引入一个新的计数器变量作为与数组中的行号相对应的索引,而不是使用行作为索引。这允许您按原始顺序输出行,例如
awk -v ndx=1 '
NF==0 { # empty line
for (i=1; i<ndx; i++) # for each line in array a
print a[i] # output line
if (ndx > 1) # if lines exists
print "" # output blank line at end
delete a # clear a array
del=0 # set delete group flag 0
ndx=1 # reset array index 1
next # get next record
}
/SEDS2-TOP/ { # SEDS2-TOP matched in record
del=1 # set delete group flag 1
delete a # delete array a
ndx=1 # reset array index 1
next # get next records
}
del==0 { # del group flag is zero
a[ndx++]=$0 # add line to array a
}
END { # END rule - process last group of lines
if (del==0) { # if del group flag not set
for (i=1; i<ndx; i++) # loop over lines in a
print i # output line (index)
print "" # with newline after
}
}' rowsets
在这种情况下,您的输出将是:
0.00 600.00 2214.28 785.71 1.00000 SEDS1-BOTTOM
0.00 600.00 2214.28 785.71 1.00000 SEDS1-TOP
0.00 600.00 1500.00 0.00 1.00000 WATER-BOTTOM
0.00 400.00 2004.28 785.71 1.00000 SEDS1-BOTTOM
0.00 300.00 2254.28 785.71 1.00000 SEDS1-TOP
0.00 600.00 1600.00 0.00 1.00000 WATER-BOTTOM
检查一下,如果您还有其他问题,请告诉我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)