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

Bash Unix:合并多个文件,同时删除所有文件的第一行,bash,merge,Bash,Merge,我有超过100个需要合并的文件,但是对于每个文件,第一行必须被删除。在Unix下执行此操作最有效的方法是什么?我怀疑这可能是一个使用cat和sed'1d'的命令。所有文件都具有相同的扩展名,并且位于相同的文件夹中,因此我们可能可以使用*.extension来指向这些文件。非常感谢 删除第一行后只需追加每个文件即可 #!/bin/bash DEST=/tmp/out FILES=space separated list of files echo "" >$DEST for FILE i

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

删除第一行后只需追加每个文件即可

#!/bin/bash

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

echo "" >$DEST
for FILE in $FILES
do
    sed -e'1d' $FILE >>$DEST
done

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

ls *.extension | xargs -n 1 tail -n +2
编辑:在Sorin和Gilles就管道ls输出的可能危险发表评论后,您可以使用:

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

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

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

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

要删除第一行,请参见例如(
tail-n+2文件
)。@Someprogrammerdude应该使用
tail-q-n+2文件
,以避免输出给出文件名的标题。是的,就是这个!)谢谢-1对于管道ls输出到某物,ls不是设计用来这样做的,使用findIn在什么情况下这是不好的Sorin?你能给出管道ls输出可能出现问题的链接吗?感谢上面的参考将解析
ls
的输出与对*.txt中的x执行内部字符串操作(如
)进行比较。它不会将解析
ls
的输出与解析
find
的输出进行比较。根据相同的逻辑,两者都是“坏的”。我尝试了
tail-n+2*.extension
。我使用的tail版本返回
tail:一次只能处理一个文件。
这就解释了更复杂的答案。
list=(*.extension)
tail -q -n +2 "${list[@]}"
tail -q -n +2 *.extension