【问题标题】:How to print file contents with filename before each line?如何在每行之前打印带有文件名的文件内容?
【发布时间】:2011-08-26 19:36:39
【问题描述】:

我有几个文件,比如 a、b、c,我想要类似的东西

 > cat a b c

但在 a 的开头行中带有“a”。 “b”位于 b 行的开头,“c”位于 c 行的开头。 我可以使用 python 做到这一点:

#!/bin/env python

files = 'a b c'

all_lines = []
for f in files.split():
  lines = open(f, 'r').readlines()
  for line in lines:
    all_lines.append(f + ',' + line.strip())

fout = open('out.csv', 'w')
fout.write('\n'.join(all_lines))
fout.close()

但我更喜欢在命令行中执行,将一些简单的命令与管道 | 结合起来。运算符。

有没有简单的方法可以做到这一点?

谢谢。

【问题讨论】:

    标签: python perl bash scripting sed


    【解决方案1】:

    grep(1)sed(1)可以为您执行此操作:grep -H '' <files> | sed 's/:/,/'

    $ cat a ; cat b ; cat c
    hello
    
    
    world
    from space
    $ grep -H '' * | sed 's/:/,/'
    a,hello
    b,
    b,
    b,world
    c,from space
    

    【讨论】:

    • 这很聪明,但您可能想在grep 中添加一个-H 选项,以防只有一个文件。
    • grep -H更便携:grep '' /dev/null a b c
    • @Gilles,非常好的建议,谢谢。但是,将其集成到一个简单的示例中比较困难,因此希望将评论标记为有用的内容能够很好地引起人们的注意。 :)
    【解决方案2】:

    您也可以使用awk(1) 程序:)

    $ awk 'BEGIN { OFS=","; } {print FILENAME , $0;}' *
    a,hello
    b,
    b,
    b,world
    c,from space
    d,,flubber
    

    【讨论】:

    • 为什么不把 OFS 设置为逗号?
    【解决方案3】:
    perl -pe 'print "$ARGV,"' a b c
    

    会做的。

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多