如果找到特定趋势,则合并CSV文件中的特定行

时间:2014-12-04 16:46:27

标签: shell csv awk sed grep

我一直坚持为下面提到的场景创建脚本: 我有一个文件a.csv,内容为

123,fsfs,4124124,412412
1314,fasfwe,42145,rwr
1234,fwtrwqt,twt
wqrfsdgaseg
12424,23532,fafwe,gewgt
14214,wet,wertwtw,wet

由于某些应用程序,一行的CSV内容会在第二行打印出来。

我的任务是找到这样的事件并将这些行合并到一个新文件中。 所以新文件将只包含所需的CSV记录我尝试使用sed做了一些事情,但无法成功。

2 个答案:

答案 0 :(得分:2)

$ awk -F, '!length $4 && length $3 {printf "%s,", $0;next}1' file 
123,fsfs,4124124,412412
1314,fasfwe,42145,rwr
1234,fwtrwqt,twt,wqrfsdgaseg
12424,23532,fafwe,gewgt
14214,wet,wertwtw,wet

答案 1 :(得分:1)

之前的所有答案看起来都很棒,但我想添加一个sed答案,因为sed太棒了! (sed已添加为标记,因此我们错过了sed答案。)

这个答案应该适用于多行,只要切割总是在分隔符上发生并且省略了该分隔符(参见这些假设的输入示例)。

sed ':l;/\([^,]*,\)\{3\}[^,]*/!{;N;s/\n/,/g;bl;}' <file_in >file_out

它的作用是:

  • 定义标签(:l
  • 测试是否有四个字段(/\([^,]*,\)\{3\}[^,]*/
  • 如果没有(!),请执行阻止({;N;s/\n/,/g;bl;}

块:

  • 将下一行读入缓冲区(N
  • 使用分隔符(s/\n/,/g
  • 替换换行符
  • 通过分支到我们的:l标签(bl
  • 进行循环

证明:

$ sed ':l;/\([^,]*,\)\{3\}[^,]*/!{;N;s/\n/,/g;bl;}' <<EOF
> 123,fsfs,4124124,412412
> 1314,fasfwe,42145,rwr
> 1234,fwtrwqt,twt
> wqrfsdgaseg
> 12424,23532,fafwe,gewgt
> 14214,wet,wertwtw,wet
> EOF
123,fsfs,4124124,412412
1314,fasfwe,42145,rwr
1234,fwtrwqt,twt,wqrfsdgaseg
12424,23532,fafwe,gewgt
14214,wet,wertwtw,wet