【问题标题】:Handling empty files when concatenating files in bash在 bash 中连接文件时处理空文件
【发布时间】:2017-02-04 03:25:27
【问题描述】:

我有一些(比如 100 个)CSV 文件,其中一些(比如 20 个)是空的(即 0 字节文件)。我想将这些文件连接成一个 CSV 文件(例如,assorted.csv),并满足以下要求:

对于每个空文件,assorted.csv 中必须有一个空行。

似乎只是简单地执行cat *.csv >> assorted.csv 会完全跳过空文件,因为它们没有任何行,因此没有任何东西可以连接。

虽然我可以使用任何高级编程语言来解决这个问题,但我想知道是否以及如何使用 Bash 来解决这个问题。

【问题讨论】:

  • 你不在乎这些行来自哪个文件?
  • 在我目前的要求中,我这样做了,但我的每个文件只包含一行,并且文件遵循编号命名约定,所以这不是问题。
  • 标记每一行会很容易...有兴趣吗?
  • 好吧好吧!!!算我一个:)

标签: bash csv


【解决方案1】:

只需循环并检测文件是否为空。如果它是空的,只需在其中回显文件名+逗号:这将创建一个近乎空白的行。否则,在每一行前加上文件名+逗号。

#!/bin/bash

out=assorted.csv
# delete the file prior to doing concatenation
# or if ran twice it would be counted in the input files!
rm -f "$out"

for f in *.csv
do
   if [ -s "$f" ] ; then
      #cat "$f" | sed 's/^/$f,/'  # cat+sed is too much here
      sed "s/^/$f,/" "$f"
   else
      echo "$f,"
   fi
done > $out

【讨论】:

  • 是的!!我愚蠢地不回到基础知识并假设必须有一个更简单的单线技巧来做到这一点。这当然是可能的。非常感谢。接受这个。
  • 考虑在done 关键字之后只放置一个重定向,而不是多次打开文件!
  • 很难找到用于不同输入的一个衬里,但是,你可以用 ls 和粘贴做一个 3 衬里,我想......实际上,加入......但它有点不透明...... .(顺便说一句,我对文件名前面的文件的编辑正在审查中。)
  • @gniourf_gniourf 不错的建议。将编辑(现在不是通过我的手机!)
  • edit+merged 根据 OP 的意愿与 BenPen 编辑合并。
猜你喜欢
  • 1970-01-01
  • 2014-09-16
  • 2018-09-18
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多