我们需要一个shell脚本来检索当前目录中的所有txt文件,并检查每个文件是否为空文件或包含其中的任何数据(我相信可以使用wc命令完成)。
如果它是空的,那么忽略它,因为在我们的条件下,这个目录中的所有txt文件都将为空或包含大量数据,其中文件的最后一行将是这样的:
Z|11|21||||||||||
这是最后一行包含字符Z
然后|
然后an integer
然后|
然后an integer
然后是一定数量的|
符号
如果文件不为空,那么我们假设它具有这种格式。最后一行之前的数据是乱码的,对我们来说不是必需的,但在最后一行之前至少有一行,即如果文件非空,将至少保证两行。
我们需要一个代码,其中,如果文件非空,则它接收文件,用'filename.txt'替换最后一行中的'Z',并将新数据写入另一个文件,例如tempfile。最后一行将变为:
filename.txt|11|21|||||||
该行的剩余部分保持不变。从临时文件中取出最后一行,即filename.txt|int|int|||||
并合并到最终文件中。清除tempfile的内容以从同一目录中的下一个filename.txt接收数据。 finalfile具有该目录中所有非空txt文件的最后几行的编辑版本。
例如:file1.txt的数据为
....
....
....
Z|1|1|||||
和file2.txt的数据为
....
....
....
Z|2|34|||||
运行脚本后,file1.txt的新数据变为
.....
.....
.....
file1.txt|1|1||||||
这将被写入一个新的文件,例如temp.txt,它最初是空的。从那里,最后一行合并到一个文件final.txt。因此,final.txt中的数据是:
file1.txt|1|1||||||
在此合并之后,temp.txt中的数据被清除 file2.txt的新数据变为
...
...
...
file2.txt|2|34||||||
这将写入相同的文件temp.txt。从那里,最后一行合并到同一个文件final.txt 所以,final.txt中的数据是
file1.txt|1|1||||||
file2.txt|2|34||||||
在考虑N个文件返回为txt类型且非空并且在同一目录中之后,final.txt中的数据变为
file1.txt|1|1||||||
file2.txt|2|34||||||
file3.txt|8|3||||||
.......
.......
.......
fileN.txt|22|3|||||
对于某些条件,我已经知道命令,如
用于在文本类型的目录中查找文件,
find <directory> -type f -name "*.txt"
获取最后一行并将其合并到另一个文件
tail -1 file.txt>>destination.txt
答案 0 :(得分:1)
您可以使用'sed'替换“z”字符。你将处于一个循环中,所以你可以使用你拥有的文件名。这只是删除Z,然后回显行和文件名。
祝你好运。#!/bin/bash
filename=test.txt
line=`tail -1 $filename | sed "s/Z/$filename/"`
echo $line
修改强>
您是否先运行find
命令并查看输出?它当然在每行的开头有./
。这将打破sed,因为sed使用/
作为分隔符。它也不适用于你的问题语句,它在文件名之前没有额外的“/”。你说当前目录,你给出的命令将遍历所有子目录。尝试简单并使用LS
。
# `2>/dev/null` puts stderr to null, instead of writing to screen. this stops
# us getting the "no files found" (error) and thinking it's a file!
for filename in `ls *.txt 2>/dev/null` ; do
... stuff ...
done