如何在unix中删除文件中以字符串开头的最后一行
我有一个以下格式的文件如何在unix中删除文件中以字符串开头的最后一行,unix,sed,Unix,Sed,我有一个以下格式的文件 AB1234 jhon cell number etc MD 2 0 8 -1 MD4567 Jhon2 cell number etc MD 2 0 8 -1 我想找到以“md2”开头的最后一行(不是MD,因为MD嵌入在其他数据中)并删除该行。 所以我的输出应该是-- 我在sed中尝试了许多正则表达式,但它似乎不起作用 sed -e '/
AB1234 jhon cell number etc
MD 2 0 8 -1
MD4567 Jhon2 cell number etc
MD 2 0 8 -1
我想找到以“md2”开头的最后一行(不是MD,因为MD嵌入在其他数据中)并删除该行。
所以我的输出应该是--
我在sed
中尝试了许多正则表达式,但它似乎不起作用
sed -e '/^MD *2/p' <file Name >
sed '/^(MD 2)/p' <file Name>
sed-e'/^MD*2/p'
sed'/^(MD 2)/p'
您可以通过两个步骤完成此操作:
sed
n=$(awk '/^MD *2/ { n=NR } END { print n }' filename)
sed "${n}d" filename
如果您试图精确匹配第二列中的
2
(而不是以2
开头的字符串),请执行两次操作:
awk 'NR==FNR && $1 == "MD" && $2 == "2"{k=NR} NR!=FNR && FNR!=k' input input
或者,如果您有权访问tac
并希望对文件进行3次传递:
tac input | awk '$1 == "MD" && $2 == "2" && !k{ k=1; next}1' | tac
要匹配第二列不完全等于字符串
2
,而只是以2
开头的情况,请将上面的$2==“2”
替换为$2~/^2/
,这里有一种方法
awk '{a[NR]=$0} /^MD *2/ {f=NR} END {for (i=1;i<=NR;i++) if (f!=i) print a[i]}' file
AB1234 jhon cell number etc
MD 2 0 8 -1
MD4567 Jhon2 cell number etc
awk'{a[NR]=$0}/^MD*2/{f=NR}END{for(i=1;i这可能适合您(GNU-sed):
这将在保留空间中保留一个行窗口。当遇到所需的模式时,它将打印出当前窗口并启动一个新窗口。在文件末尾,它将打印出除第一行以外的所有窗口(因为它是要删除的所需模式的第一行).我已回滚我的编辑,因为我无法理解您的数据和question@1_CR,FWIW,我想你的编辑就是OP的意思,除了可能是“MD”和“2”之间的多个空格,等等@shoover,你可能是对的,谢谢。等待OP发表意见;-)+1代表tac |…| tac
。以前没有见过
awk '{a[NR]=$0} /^MD *2/ {f=NR} END {for (i=1;i<=NR;i++) if (f!=i) print a[i]}' file
AB1234 jhon cell number etc
MD 2 0 8 -1
MD4567 Jhon2 cell number etc
sed '/^MD\s\+2/,${//{x;//p;d};H;$!d;x;s/^[^\n]*\n//}' file