2013-07-31 15 views
1

我有一個.CSV文件,它在一個標題之後有很少的記錄,但是,在結束之前有一個重複的標題的文件,然後重複的頭是幾個更多的記錄(我不需要)。有沒有辦法可以檢查第二次出現的標題的模式,並在重複的標題之後刪除文件的其餘部分?以下是該文件的示例。如何刪除一個在.CSV文件中第二次出現的模式後的其餘記錄

COL0,COL1,COL2,COL3,COL4,COL5,COL6,
1value0,1value1,1value2,1value3,1value4,1value5,1value6,
2value0,2value1,2value2,2value3,2value4,2value5, 2value6,
3value,3value1,3value2,3value3,3value4,3value5,3value6,
2value0,4value1,4value2,4value3,4value4,4value5,4value6,
5value0,5value1,5value2,5value3,5value4,5value5,5value6,
6值0,6值1,6值2,6值3,6值4,6值5,6值6,
,,,,,,,
,,,,,,,
,,,,,,,
第(n-1)value0,(N-1)值1,第(n-1)值2,( (n)value3,(n-1)value4,(n-1)value5,(n-1)value6,
(n)value0,(n)value1,(n)value2,(n)value3,( n)的值4,(n)的值5,(n)的value6,
COL0,COL1,COL2,COL3,COL4,COL5,COL6,
1,不需要的,記錄,之後,,複製,頭
2,不想要的,記錄,之後,複製標題
3,不需要的記錄,之後,複製標題

這裏說我期待的輸出如下所示

COL0,COL1,COL2,COL3,COL4,COL5,COL6,
1value0,1value1,1value2,1value3,1value4,1value5,1value6,
2value0,2value1,2value2,2value3,2value4,2value5,2value6,
3value,3value1,3value2,3value3,3value4,3value5,3value6,
2value0,4value1,4value2,4value3,4value4,4value5,4value6,
5value0 ,5值1,5值2,5值3,5值4,5值5,5值6,
6value0,6value1,6value2,6value3,6value4,6value5,6value6,
,,,,,,,
,,,,,,,
,,,,,,,
第(n-1) (n-1)值1,(n-1)值2,(n-1)值3,(n-1)值4,(n-1)值5,(n-1)值6,
(n)value0 ,(n)的值1,(n)的值2,(n)的值3,(n)的值4,(n)的值5,(n)的value6,

PS:我有GNU sed的版本4.1.5和GNU awk中3.1.5

任何幫助,高度讚賞。

+0

旨在是從最初的一個不同的第二報頭(缺少「COL0」),所以這只是一個部分匹配,或者這只是一個錯字? – fileunderwater

+0

對不起,他們都是一樣的......我只是檢查並糾正它..謝謝你 – Dhruuv

+0

隨時upvote或接受你覺得有幫助的答案。 – fileunderwater

回答

2

嘗試這種情況:

awk 'a~$0{exit}NR==1{a=$0}1' file 
+0

你能解釋一下代碼,它在做什麼?將是非常有用的...只是試圖學習新的東西每一天...在此先感謝... – Dhruuv

+1

'NR == 1'運行第一行的行動,這是行變量'a'存儲。 '1'用於打印。第一個模式'a〜$ 0'檢查變量'a'是否被初始化並且有一個像你的第一行一樣的值。如果是這樣,那麼只需退出因爲您不需要打印標題行以及其後面的內容。 –

0

嘗試

awk 'd<2{print} /col1, col2, col3 , col4 , col5, col6/{d++}' file 
+0

你能解釋一下這段代碼嗎? – Dhruuv

+0

此答案是在您更正問題之前編寫的,因此請勿使用此答案。它和fileunderwater的解決方案基本上是一樣的:雖然(增加匹配計數器d ++)並且僅在2:nd發生(d <2)之前打印行,但完全匹配「col1,col2,col3,col4,col5,col6」。 – svante

2

這可能爲你工作(GNU sed的4.2。1):

sed 's/,/\n/8;T;s/\n.*//;q' file 

該作品以試圖通過自身,如果不能擺脫困境並打印線像往常一樣去更換8 ,。大多數行(在你的例子中)只有7個逗號,因此將被單獨保留,而包含重複頭的行將被縮短並在處理結束時打印出來。

2

大概方式更復雜比它需要的是:

awk 'BEGIN{flag=0} $0==head{flag=1}; NR==1{head=$0}; flag==0{print $0}' file 
+0

這個工作,但請你解釋一下代碼,這樣下次使用它會很有幫助......欣賞你的時間...... – Dhruuv

+1

BEGIN塊在讀取文件之前運行並初始化一個標誌變量。 '$ 0 == head'檢查當前行是否等於變量「head」,如果是則設置flag = 1。 NR == 1 {head = $ 0}將頭部設置爲文件的第一行(標題)。 flag == 0 {print $ 0}將打印flag == 0的所有行(即重複標題前的所有行)。代碼比需要的更長,但易於理解。 – fileunderwater

相關問題