2013-12-24 25 views
1

我有一個輸出,我管道awk,並在一些行的末尾找到一個很好的RS字符串。 但是,當我將尾隨字符串定義爲RS時,awk僅刪除整行內容。我希望保留RS字符串的數據,只有RS從行中刪除。awk - 打印RS之前的數據,同一行

awk的例子輸入:從AWK

data data data RS_STRING 
data SEARCHED_STRING data data 
data data 

data data data RS_STRING 
data data data 
data data 

data data data RS_STRING 
data SEARCHED_STRING data data 
data data 

所需的輸出:

data data data 
data SEARCHED_STRING data data 
data data 

data data data 
data SEARCHED_STRING data data 
data data 

我現在awk的語法是:

awk '/SEARCHED_STRING/' RS = "RS_STRING" 

...我得到:

data SEARCHED_STRING data data 
data data 


data SEARCHED_STRING data data 
data data 

正如您通過將RS_STRING定義爲RS所看到的那樣,awk會去除該行中包含的RS之前的所有數據。

我一直在尋找過去三天的解決方案,但還沒有找到。

預先感謝您。

+2

歡迎堆棧溢出。請儘快閱讀[關於]頁面。 RS是記錄(行)分隔符;你是在想也許你找到了一個好的場分隔符?如果您指的是記錄分隔符,則樣本數據只有3條記錄,第三條記錄不會終止(第一個RS STRING之前的素材,兩個標記之間的素材以及第二個標記之後的素材)。什麼是你正在使用的RS字符串?你究竟如何設置RS? –

+0

如上所述,我遇到的問題是將RS設置爲不在線的起始位置。當我在一行的開頭設置一個RS時,它會從該行中刪除,並且該行後面的RS數據保持不變。但是如果RS位於線路中的任何其他位置,則直到定義的RS的所有內容都將被刪除。我想保留這些數據。這個例子就是爲了說明我正在努力完成的事情。 –

+0

嘗試sed,並用null替換RS STRING。示例:sed's/RS STRING //' – alvits

回答

1

用awk用空行作爲記錄分隔

awk 'BEGIN{RS="";FS="RS_STRING"} 
    /SEARCHED_STRING/{$1=$1;print $0 ORS}' file 

如果有記錄之間不空行,並RS_STRING始終處於創紀錄的第一行,那就試試這個:

awk '/RS_STRING/{i++}{a[i]=a[i]==""?$0:a[i]RS $0} 
    END{for (j=1;j<=i;j++) if (a[j]~/SEARCHED_STRING/) print a[j]}' file 
+1

由於您已經有BEGIN塊,所以不妨添加'ORS =「\ n \ n」'並從打印語句中刪除ORS。 –

+0

@glennjackman爲什麼?這是有效的,'ORS'比ORS =「\ n \ n」'少7個字符。如果不需要,我通常不會使用'BEGIN'塊,並在表達式後面添加變量以保存'-v',就像這樣'awk'/ SEARCHED_STRING/{$ 1 = $ 1; print $ 0 ORS}'RS =「」FS = 「RS_STRING」file' – Jotne

+0

有沒有辦法修改這個awk語法以使RS =「RS_STRING」而不是「」?我問這是因爲我的輸入不一定在記錄之間有空行,RS除了RS_STRING外不能是其他任何東西,以便獲得所需的輸出。 –

1

一非aw回答

perl -00 -ne '/SEARCHED_STRING/ and do {s/RS_STRING//g; print}' 

用搜索字符串搜索段落並刪除t他「rs」字符串。

+0

謝謝,這個解決方案產生了預期的結果。你能解釋一下這個語法嗎?我很好奇它是如何正確分離記錄的。我只能識別搜索模式(SEARCHED_STRING)和空白替換RS_STRING。但是它是如何知道RS_STRING是我的記錄分隔符? –

+0

在Perl文檔中發現:「00的特殊值會導致Perl在段落模式下啜泣文件,任何值爲0400或更大的值都會導致Perl整個文件渾濁,但按照慣例,值0777是通常用於此目的的文件。 「不幸的是我不明白這一點。 –

+0

有沒有辦法修改上述解決方案,以便專門具有由RS_STRING分隔的記錄?我的輸入不一定在記錄之間留有空行,因此當我在我的實時數據上測試命令時,它包含了一些通常在RS由RS_STRING定義的情況下將被剝離的信息。謝謝。 –

0

它爲我的作品:

echo "ab RS_STRING cd" | awk '{print "NR="NR ": \""$0"\""}' RS="RS_STRING" 

使輸出

NR=1: "ab " 
NR=2: " cd 
" 

如你所見,沒有任何部件,除了字符串"RS_STRING"剝下..