【问题标题】:Combine multiple files into one including the file name将多个文件合并为一个,包括文件名
【发布时间】:2019-11-26 11:57:34
【问题描述】:

我一直在环顾四周,试图将多个文本文件组合成包含文件名的文件。

我当前的文件内容是:

1111,2222,3333,4444

我追求的是:

File1,1111,2222,3333,4444
File1,1111,2222,3333,4445
File1,1111,2222,3333,4446
File1,1111,2222,3333,4447
File2,1111,2222,3333,114444
File2,1111,2222,3333,114445
File2,1111,2222,3333,114446

我发现了多个示例如何将它们全部组合,但没有将它们组合在一起,包括文件名。

【问题讨论】:

  • 在 SO 上,我们鼓励用户为解决自己的问题付出努力。因此,请务必在您的帖子中添加您的努力,然后让我们知道。
  • 很不清楚你想做什么。对不起。
  • @RavinderSingh13,我用 cat/awk 等尝试的一切都没有按照我的意愿工作。
  • @stephanmg,我正在尝试将所有文​​件合并为一个,而新文件也将有一个包含文件名的列,如上例所示。
  • @Svan,不用担心,如果您的尝试是错误的或正确的,没有人会说什么,这里只有规则是我们所有人都在这里学习,这适用于所有人,所以请始终添加您的努力解决你的问题,相信我,你会在这个伟大的网站上得到很好的指导,干杯。

标签: bash shell awk cat


【解决方案1】:

请您尝试以下操作。考虑到您的 Input_file 扩展名是 .csv

awk 'BEGIN{OFS=","} {print FILENAME,$0}' *.csv > output_file

如果文件扩展名是.txt,那么在查看 OP 的 cmets 后尝试:

awk 'BEGIN{OFS=","} {print FILENAME,$0}' *.txt > output_file

【讨论】:

    【解决方案2】:

    假设您的所有文件都具有.txt 扩展名并且只包含如示例中的一行,您可以使用以下代码:

    for f in *.txt; do echo "$f,$(cat "$f")"; done > output.log
    

    output.log 是输出文件。

    【讨论】:

    • @stephanmg 对我来说看起来像是必要使用 cat。
    • 好吧,这个解决方案只适用于具有单行内容的文件。如果一个文件有超过 1 行,它只会将文件名添加到输入的第一行......
    【解决方案3】:

    好吧,它有效:

    printf "%s\n" *.txt |
    xargs -n1 -d $'\n' bash -c 'xargs -n1 -d $'\''\n'\'' printf "%s,%s\n" "$1" <"$1"' --
    
    1. 首先输出一个换行符分隔的文件列表。
    2. 然后对每个文件xargs执行sh
      1. 在 sh 内部对文件的每一行执行 xargs
        1. 它为每一行输入执行printf "%s,%s\n" &lt;filename&gt;

    repl 测试。

    【讨论】:

    • 谢谢,结果是:file1..txt: : 没有那个文件或目录
    • 哦,okj,让我们看看。编辑了答案。将sh 更改为bash 后,它可以在repl 上的外部站点上运行。因此,请检查您是否完全按照预期复制和/或使用了代码,或者发布您的代码进行检查。
    【解决方案4】:

    使用grep "" *.txt -I &gt; $filename解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 2012-10-15
      • 2016-01-31
      • 2013-01-09
      相关资源
      最近更新 更多