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