2014-10-08 52 views
2

我做了下面的腳本里面:取下變量字符串最後一行awk腳本

awk ' { 
    if ($1 ~ /^d/) { 
    a=a $0; 
    } 
    .... -> rest code 
    if (p == 1) { 
    b=a; 
    print b; 
    } 
} ' input.txt 
  • 一個 - 與IT賣場發現,因此,我將工作以後所以不能改變其結構
  • b - 的店面部分,像頭

輸入文件:

 d1file some text 
     edont show that 
     d2file like it 
     d3file need to remove 

年底內容:

 d1file some text 
     d2file like it 
     d3file need to remove 

我會想做什麼:

如果$ 1開始與d我將其存儲在一個變量裏面。後來我想移動一個bb刪除最後一行,所以b輸出應該是:

 d1file some text 
     d2file like it 

我一直在尋找的任何解決方案,但沒有運氣可言。我正在考慮將數據存儲爲a內容,並使用index-1來刪除最後一行,但我無法工作。

有沒有辦法做到這一點?

+1

是不是'不顯示'也'開始'D'? – anubhava 2014-10-08 19:17:29

+0

爲什麼'a = b'?爲什麼要將這一切都存儲在'a'中?在你的例子中,什麼是放棄'不顯示'?如果目標是打印出每一條匹配的線,但最後還有更簡單的方法來做到這一點。 – 2014-10-08 19:18:48

+0

我的不好,應該是'edont show that',改了。 @Etan我會稍後用'a'工作,而不會改變它。 – Steve 2014-10-08 19:21:08

回答

1
awk ' 
    /^d/ { a = a $0 "\n"}   # accumulate lines starting with d 
    END { 
    sub(/\n[^\n]*\n$/, "", a); # remove the last line 
    print a 
    } 
' input.txt 
+0

謝謝@ooga,工作得很好,我在開始嘗試數組時,JNevill解決方案說,但我喜歡你的想法,不知道sub()也可以。 – Steve 2014-10-08 20:08:46

2

這應該做的工作:

awk 'BEGIN {counter=1} { if ($1 ~ /^d/) array[counter++]=$0} END { for (element=1;element<counter-1;element++) print array[element]}' input.txt 

這枝陣列中的所有搜索命中,然後在最後打印所有,但陣列

+0

謝謝@JNevill按預期工作。 – Steve 2014-10-08 20:02:42

0
awk '/^d/{a[nr++]=$0}END{for(i=0;i<nr-1;i++) print a[i]}'input.txt 

/^d/的最後一個元素選擇以d開頭的行,並執行該操作可保存行a中的行,如果它以d

ENDfor將打印陣列exluding最後

+0

它會打印所有結果,直到你改變'i Steve 2014-10-08 19:57:31

+0

這是'nr-1'抱歉的錯誤 – nu11p01n73R 2014-10-08 20:02:14

0

我不明白這裏的終極目標,這似乎是一個奇怪的方式來做事,但是這應該做你想要什麼:

awk 'tmp{b=b (b?ORS:"") tmp; tmp=""}; /^d/{tmp=$0;next} END{a=b (tmp?ORS:"") tmp; ...do something with a and b here...} input.txt 

例如:

$ cat input.txt 
d1file some text 
edont show that 
d2file like it 
d3file need to remove 
$ awk 'tmp{b=b (b?ORS:"") tmp; tmp=""}; /^d/{tmp=$0;next} END{a=b (tmp?ORS:"") tmp; print "--"; print a; print "--"; print b; print "--"}' input.txt 
-- 
d1file some text 
d2file like it 
d3file need to remove 
-- 
d1file some text 
d2file like it 
-- 
1

你可以使用這個簡單的awk命令:

awk '$1 ~ /^d/{if(p) a=a p; p=$0 ORS} END{printf a}' input.txt 
d1file some text 
d2file like it 
+0

謝謝,作品。 – Steve 2014-10-08 20:14:10

+0

不客氣,很高興它的工作。 – anubhava 2014-10-08 20:15:50

相關問題