Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在unix中删除文件中以字符串开头的最后一行_Unix_Sed - Fatal编程技术网

如何在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