34

我有超过 100 个需要合并的文件,但是对于每个文件,必须删除第一行。在 Unix 下最有效的方法是什么?我怀疑这可能是使用catsed '1d'的命令。所有文件都具有相同的扩展名并且位于同一个文件夹中,因此我们可能可以使用 *.extension 来指向这些文件。非常感谢!

4

5 回答 5

38

假设您的文件名按您希望附加文件的顺序排序,您可以使用:

ls *.extension | xargs -n 1 tail -n +2

编辑:在 Sorin 和 Gilles 评论管道ls输出可能存在的危险之后,您可以使用:

find . -name "*.extension" | xargs -n 1 tail -n +2
于 2012-04-11T10:00:53.633 回答
20

每个人都必须是复杂的。这真的很容易:

tail -q -n +2 file1 file2 file3

等等。如果您有大量文件,您可以先将它们加载到数组中:

list=(file1 file2 file3)
tail -q -n +2 "${list[@]}"

当前目录中具有给定扩展名的所有文件?

list=(*.extension)
tail -q -n +2 "${list[@]}"

要不就

tail -q -n +2 *.extension
于 2012-04-11T12:00:06.303 回答
6

只需在删除第一行后附加每个文件。

#!/bin/bash

DEST=/tmp/out
FILES=space separated list of files

echo "" >$DEST
for FILE in $FILES
do
    sed -e'1d' $FILE >>$DEST
done
于 2012-04-11T09:55:57.707 回答
3

tail输出文件的最后几行。您可以告诉它要打印多少行,或者在开头省略多少行(-n +N其中 N 是要打印的第一行的编号,从 1 开始计数 - 因此+2省略一行)。使用 GNU 实用程序(即在 Linux 或 Cygwin 下)、FreeBSD 或其他具有以下-q选项的系统:

tail -q -n +2 *.extension

tail在每个文件之前打印一个标题,并且-q不是标准的。如果您的实现没有它,或者是可移植的,您需要遍历文件。

for x in *.extension; do tail -n +2 <"$x"; done

或者,您可以调用 Awk,它可以识别每个文件的第一行。如果您有很多小文件,这可能会更快,如果您有很多大文件,这可能会更慢。

awk 'FNR != 1' *.extension
于 2012-04-11T11:27:06.147 回答
2
ls -1 file*.txt | xargs nawk 'FNR!=1'
于 2012-04-11T11:36:42.523 回答