我有一个以下格式的文件
AB1234 jhon cell number etc
MD 2 0 8 -1
MD4567 Jhon2 cell number etc
MD 2 0 8 -1
我想找到以“MD 2”开头的最后一行(不是MD,因为MD嵌入在其他数据中)并删除该行。 所以我的输出应该是 -
AB1234 jhon cell number etc
MD 2 0 8 -1
MD4567 Jhon2 cell number etc
我在sed
中尝试了很多正则表达式,但似乎它无效......
sed -e '/^MD *2/p' <file Name >
sed '/^(MD 2)/p' <file Name>
答案 0 :(得分:3)
这可能适合你(GNU sed):
sed '/^MD\s\+2/,${//{x;//p;d};H;$!d;x;s/^[^\n]*\n//}' file
这会在保留空间中保留一个线条窗口。当遇到所需的模式时,它会打印出当前窗口并启动一个新窗口。在文件的末尾,它打印出窗口的第一行以外的所有行(因为它是要删除的所需模式的第一行)。
答案 1 :(得分:2)
您可以分两步完成:
sed
例如:
n=$(awk '/^MD *2/ { n=NR } END { print n }' filename)
sed "${n}d" filename
答案 2 :(得分:2)
如果您尝试在第二列中精确匹配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/
替换为{{1}}
答案 3 :(得分:1)
这是一种方法。
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
将所有数据存储在数组a
中
在MD 2
中搜索并查找最后f
并存储记录编号
然后打印数组a
,但仅当记录号不等于f