2013-12-21 100 views
0
開始用繩子

我在下面的格式如何刪除文件的最後一行在UNIX

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

我回滾了我的編輯,因爲我可以不理解您的數據和您的問題 – iruvar

+0

@ 1_CR,FWIW,我認爲您的編輯是OP的意思,除了可能爲「MD」和「2」之間的多個空格「等 – shoover

+0

@shoover,你可能是對的,謝謝。等待OP發言;-) – iruvar

回答

2

可以在2個步驟執行此操作:

  1. 找到該行的行號
  2. 刪除該行使用sed

例如:

n=$(awk '/^MD *2/ { n=NR } END { print n }' filename) 
sed "${n}d" filename 
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

對於'tac | ... | tac'。以前沒見過 – Bohemian

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
搜索和發現f
然後打印陣列a最後MD 2和存儲記錄號,但只有當記錄號不在f

3

這等於值可能適合你(GNU sed):

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

This在保持空間中保持一條線。當它遇到所需的模式時,它打印出當前窗口並開始一個新窗口。在文件結束時,它會打印出除窗口第一行以外的所有內容(因爲它是要刪除的所需模式的第一行)。