Unix:合并多个文件,同时删除所有文件的第一行

时间:2012-04-11 09:52:39

标签: bash merge

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

5 个答案:

答案 0 :(得分:33)

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

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

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

find . -name "*.extension" | xargs -n 1 tail -n +2

答案 1 :(得分:17)

每个人都必须变得复杂。这很简单:

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

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:2)

ls -1 file*.txt | xargs nawk 'FNR!=1'