我一直坚持为下面提到的场景创建脚本: 我有一个文件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做了一些事情,但无法成功。
答案 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