如何删除unix中以string开头的文件中的最后一行

时间:2013-12-21 02:04:02

标签: unix sed

我有一个以下格式的文件

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>

4 个答案:

答案 0 :(得分:3)

这可能适合你(GNU sed):

sed '/^MD\s\+2/,${//{x;//p;d};H;$!d;x;s/^[^\n]*\n//}' file

这会在保留空间中保留一个线条窗口。当遇到所需的模式时,它会打印出当前窗口并启动一个新窗口。在文件的末尾,它打印出窗口的第一行以外的所有行(因为它是要删除的所需模式的第一行)。

答案 1 :(得分:2)

您可以分两步完成:

  1. 查找该行的行号
  2. 使用sed
  3. 删除该行

    例如:

    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

中的值时