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