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