2011-12-05 69 views
-2

使用Linux工具(如awk),如何在下例中獲取不在# NUMBERS行之間的所有行?換句話說,我只想要在第一個# NUMBERS之前的行和最後一個# NUMBERS之後的行。刪除第一個和最後一個標記行之間的行

注:標記並不總是準確# NUMBERS,但有可能是#NUMBERS

輸入

param1=23 
param2=34 
param3=4 

# NUMBERS 

343546 
3454 
657 
534 

# NUMBERS 

5454 

# NUMBERS 

param4=41 

預期輸出之間的任何數量的空格

param1=23 
param2=34 
param3=4 
param4=41 
+1

爲什麼不應該打印5454? –

+0

我認爲最近修改了輸入格式。 – cppcoder

+0

我的目標是在第一個「#NUMBERS」之前只打印行,並在最後一個「#NUMBERS」之後打印行 – david

回答

1

下面是使用tacawk的方法:

(
    cat data.txt | awk '/# *NUMBERS/ { nextfile } 1'; 
    tac data.txt | awk '/# *NUMBERS/ { nextfile } 1' | tac 
) 
0

有肯定比這更簡單的代碼。

awk '{if($0 ~ /#[ ]*NUMBERS/){i++;next;}if(i%2==0)print}' data.txt 

輸出

param1=23 
param2=34 
param3=4 


param4=41 
+0

我不確定OP是否期待這樣的結果。 –

+0

其不打印「param4 = 41」 – david

2

的主要思路是:前

  • 噴印行數 「#號」;
  • 請勿在「#NUMBER」之後打印行;
  • 結束打印緩衝區。

所以

$> cat ./printOutsideNumbers.awk 
/#()*NUMBER/ { 
    if (insideSection == 0) { 
     insideSection = 1; 
    } else { 
     sectionBuffer = "" 
    } 
} 
! insideSection { 
    print $0 
} 
insideSection && ! /#()*NUMBER/ { 
    sectionBuffer = sectionBuffer"\n"$0 
} 
END { 
    print sectionBuffer 
} 

而且

$> awk -f ./printOutsideNumbers.awk file.data.txt 
param1=23 
param2=34 
param3=4 



param4=41 
0

嘗試下一AWK命令。它用字符串'#NUMBER'分割文件並打印刪除空格的第一個和最後一個寄存器。

awk 'BEGIN { RS = "#[[:space:]]+NUMBERS"; } 
    FNR == 1 { sub(/^[[:space:]]*/, "", $0); sub(/[[:space:]]*$/, "", $0); print } 
    END { sub(/^[[:space:]]*/, "", $0); sub(/[[:space:]]*$/, "", $0); print }' infile 

輸出:

param1=23 
param2=34 
param3=4 
param4=41 
+0

您的awk腳本打印所有文件! – david

+0

我的awk版本是:GNU Awk 4.0.0。我不確定,但也許舊版本不支持'\ s'作爲withespace。我已將它們更改爲[:space:]。輸出在我的系統中是一樣的。 – Birei

0

這可能會爲你工作:

sed '1{h;d};H;${x;s/[^\n]*\(NUMBERS\).*\1.*\n//;p};d' file.data.txt 

說明:

將文件Sl入sed的存儲空間。然後在文件末尾,交換到HS,刪除NUMBERS之間的任何內容並打印出剩餘部分。

或者這樣:

sed '/NUMBERS/=;d' file.data.txt | 
sed -n '1h;${x;G;s/\n/,/;s,.*,sed &d file.data.txt,p}' | sh 

說明:

NUMBERS注意行號。使用第一個和最後一個地址構建sed腳本以刪除不需要的行。將腳本傳遞給shell以運行。

0

一個有趣的「貪婪」行匹配問題。 「TAC」 一個是髒的好:)我的是一樣#3

BEGIN { buffer = ""; ignore = 0; } 

/^# *NUMBERS/ { 
    if (ignore == 0) { 
     print buffer; 
     ignore += 1; 
    } 

    buffer = ""; next; 
} 

NF > 0 { 
    buffer = sprintf("%s%s\n", buffer, $0) 
} 

END { print buffer; } 

我覺得FS = 「\ n」; RS =「」,然後使用貪婪的正則表達式也將做的伎倆,但這將是sedish,而不是awkish ...

相關問題