【问题标题】:How to insert total number of lines in a new line before the first line command?如何在第一行命令之前在新行中插入总行数?
【发布时间】:2016-11-04 23:09:14
【问题描述】:

我有数千个 .xyz 文件,它们是像这样的化学坐标(例如):

  Fe        0.000000000     0.000000000     0.000000000
   C        2.112450000     0.000000000     0.000000000
   C        0.039817193     1.817419422     0.000000000

我搜索了很多简单的命令,如 sed 或 head and tail,在文件顶部写入计数的行数(使用换行符 \n 并在总数前有两个空格)但不能不会成功。 我真的很感激任何帮助。 输出mst是这样的:

  3
Fe       0.000000000     0.000000000     0.000000000
C        2.112450000     0.000000000     0.000000000
C        0.039817193     1.817419422     0.000000000

【问题讨论】:

  • @John Zwinck 感谢编辑
  • 类似cat <(printf " $(wc -l < file.xyz)\n") file.xyz ?

标签: sed word-count


【解决方案1】:

您可以将其作为复合命令来执行:

(wc -l < fileA && cat fileA) > outputA

请注意,我在那里使用了&lt; 以确保wc 不会在第一行打印文件名。至少在 Mac OS 上,如果您不使用这样的重定向,它会这样做。


编辑:如果您需要对许多文件应用相同的内容:

mkdir output
ls *.xyz | while read filename; do
    (wc -l < $filename && cat $filename) > output/$filename
done

只是为了好玩,这里有一个您应该使用但在某些情况下可以使用的命令:

tee xxx < fileA | wc -l > xxx # don't do this

【讨论】:

  • 感谢您的回复。第一个命令适用于一个文件,但在我有超过 5000 个文件的情况下,我必须对该命令应用哪些更改才能保留文件名并分别为所有文件执行此操作? (例如“*.xyz”)
  • @Amir:我添加了一个在所有 *.xyz 文件上编写循环的示例。
  • 非常感谢,它完美地解决了我的问题。非常感谢您的帮助
  • 文件名带有空格的循环中断,最好是for filename in *.xyz; do,IMO。
  • 好点,我没想到。我进行了一个快速实验以在我的系统 (2097152) 上创建一个比 ARG_MAX 更长的命令行,但实际上是 ls 爆炸了,而不是 shell for 循环。根据this 的说法,for 循环实际上是解决因参数太长而失败的命令(但速度很慢)的方法。 (它还指出快速解决方案是find,正如您所提到的。)
【解决方案2】:

试试这个:

sed '1i \
'$(wc -l < file.xyz) file.xyz

使用find 处理多个文件并使用-i 标志就地编辑文件

find . -name '*.xyz' -exec sh -c 'sed -i "1s/.*/$(wc -l < {})\n&/" {}' \;

注意:因为文件将使用此命令在原地编辑,您可能需要先检查输出。为此,请删除sed 之后的-i 标志。如果该命令满足您的需求,则再次添加-i 标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多