【问题标题】:Merging specific lines in a CSV file if specific trend is found out如果发现特定趋势,则合并 CSV 文件中的特定行
【发布时间】:2015-02-02 15:36:24
【问题描述】:

我一直坚持为以下提到的场景创建脚本: 我有一个文件 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 尝试了几件事,但未能成功。

【问题讨论】:

  • 您意识到 Stackoverflow 是关于帮助人们解决编程问题的,而不是免费的编码服务?无论如何,您至少需要向我们展示!您的示例输入的输出应该是什么。你的口头描述模棱两可。祝你好运。
  • 抱歉,伙计,但这是我第一次不得不在这里问具体问题,因为时间有限。

标签: shell csv awk sed grep


【解决方案1】:
$ 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

【讨论】:

  • 谢谢斯普特尼克。我将为我的脚本使用您的 awk 解决方案。我设法通过使用 xarg 和 awk 完成了这件事,但我很乐意实现所有人在这里发布的所有解决方案,看看哪个是最好的
【解决方案2】:

之前的所有答案看起来都很棒,但我也想添加一个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)
  • 通过分支到我们的:llabel (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

【讨论】:

  • 谢谢哥们。我会看看这是否可以满足我的要求,因为这适用于我的测试数据
猜你喜欢
  • 2018-12-22
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 2011-03-22
  • 2021-02-13
  • 1970-01-01
相关资源
最近更新 更多