用文件名替换unix文件最后一行的第一个字符

时间:2011-12-15 07:33:34

标签: unix replace filenames

我们需要一个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

1 个答案:

答案 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