如何在.CSV文件中第二次出现的模式后删除其余记录

时间:2013-07-31 13:51:03

标签: linux csv sed awk

我有一个.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,
  6value0,6value1,6value2,6value3,6value4,6value5,6value6,
  ,,,,,,,
  ,,,,,,,
  ,,,,,,,
  (n-1)value0,(n-1)value1,(n-1)value2,(n-1)value3,(n-1)value4,(n-1)value5,(n-1)value6,<登记/>   (n)value0,(n)value1,(n)value2,(n)value3,(n)value4,(n)value5,(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,5value1,5value2,5value3,5value4,5value5,5value6,
  6value0,6value1,6value2,6value3,6value4,6value5,6value6,
  ,,,,,,,
  ,,,,,,,
  ,,,,,,,
  (n-1)value0,(n-1)value1,(n-1)value2,(n-1)value3,(n-1)value4,(n-1)value5,(n-1)value6,<登记/>   (n)value0,(n)value1,(n)value2,(n)value3,(n)value4,(n)value5,(n)value6,

P.S:我有GNU sed版本4.1.5和GNU Awk 3.1.5

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

这可能对您有用(GNU sed 4.2.1):

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

这可以通过尝试自己替换第8个,并且如果它无法像往常一样挽救并打印线来实现。大多数行(在您的示例中)只有7个逗号,因此将保持不变,而包含重复标题的行将缩短并在处理退出时打印出来。

答案 1 :(得分:2)

可能比它需要的更复杂:

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

答案 2 :(得分:2)

试试这个:

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

答案 3 :(得分:0)

尝试

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