我有几个包含数据的日志文件。我想要做的是将所有这些文件合并到一个文件中。但在数据进入之前,我希望文件名在那里没有扩展名。例如: 我有的文件:
file1.log file2.log file3.log
我想要的文件:all.log
all.log包含在其中:
file1
file1's data
file2
file2's data
file3
file3's data
答案 0 :(得分:1)
awk 'FNR==1{sub(/[.][^.]*$/, "", FILENAME); print FILENAME} 1' file*.log >all.log
FNR
是文件记录号。它是每个文件开头的一个。因此,测试FNR==1
告诉我们我们是否在文件的开头。如果我们是,那么我们使用sub(/[.][^.]*$/, "", FILENAME)
从文件名中删除扩展名,然后我们打印它。
该计划中的最终1
是awk用这种说法打印这条线的神秘方式。
重定向>all.log
将文件all.log
中的所有输出保存。
for f in file*.log; do echo "${f%.*}"; cat "$f"; done >all.log
或者:
for f in file*.log
do
echo "${f%.*}"
cat "$f"
done >all.log
在shell中,for f in file*.log; do
在与glob file*.log
匹配的所有文件上启动循环。语句echo "${f%.*}"
打印文件名减去扩展名。 ${f%.*}
是后缀删除的示例。 cat "$f"
打印文件的内容。 done >all.log
终止循环并将所有输出保存在all.log
。
即使文件名包含空格,制表符,换行符或其他困难字符,此循环也能正常工作。
答案 1 :(得分:0)
假设您有两个文件:
FOO:
a
b
c
栏:
d
e
f
使用Perl:
perl -lpe 'print $ARGV if $. == 1; close(ARGV) if eof' foo bar > all.log
foo
a
b
c
bar
d
e
f
$.
是行号
$ARGV
是当前文件的名称
close(ARGV) if eof
重置每个文件末尾的行号
使用grep:
grep '' foo bar > all.log
foo:a
foo:b
foo:c
bar:d
bar:e
bar:f
答案 2 :(得分:0)
for i in `ls file*`; do `echo $i | awk -F"." '{print $1}' >> all.log; cat $i >> all.log`; done