我在一个文件夹中有数千个包含编码天气信息的文件。对于每个文件,我需要添加一个带有控制字符的页眉和页脚。这不是问题,因为我将页眉和页脚放在单独的文件中(使用 bash 脚本中的 cat
命令实现)。
但是,修改后的文件需要保留其原始名称 - 这给了我一个问题,因为我只有非常基本的脚本知识。保留它们的原因是这些文件将被解析和解码。文件名包含解码器如何处理内容的重要信息。
所有要解码的文件都在单独的文件中,list_of_files_to_decode.txt
.
文件夹内容的一部分可能如下所示:
a_snvs02wiix170600_c_eswi_20121117062131_76.txt
a_smci40babj170600_c_kwbc_20121117061545_3.txt
a_sath40vtbb170600_c_ekmi_20121117061604_95.txt
a_usxx40mynn70600cca_c_edzw_20121117062020_34.txt
a_siin40dems170600_c_ojam_20121117062020_40.txt
a_smxx40fapr170600rra_c_lowm_20121117062604_67.txt
list_of_files_to_decode.txt
start-seq.txt
stop-seq.txt
我已经检查了网络,并使用awk
和sed
测试了我自己的一些想法,但我真的找不到任何合适的方法来轻松实现这一目标。因此,我将不胜感激有关如何进行的一些帮助或提示。
while IFS= read -r file; do
cat header.txt "$file" footer.txt > newfile && mv newfile "$file"
done < list_of_files_to_decode.txt
解释
- 我只是使用串联和外壳重定向
-
&&
是捷径。这与if condition; then action; fi
相同
唯一安全的方法是先重命名原始文件
mv $file $file.orig
cat header $file.orig footer > $file && rm $file.orig
反之亦然,创建一个新文件,然后覆盖原始文件
cat header $file footer > $file.new && mv -f $file.new $file
sed
的无循环方式:
OLDIFS=$IFS; IFS=$'n'
sed -i '1 r header.txt
1 N
$ r footer.txt' $(<list_of_files_to_decode.txt)
IFS=$OLDIFS
笔记:
- 仅当文件名中有空格时,才将
IFS
设置为换行
符 -
r
在读取下一行时打印文件内容 1 N
防止在header.txt
内容之前打印第一行(详细信息:它读取第 2 行并附加到图案空间,触发
r
打印出header.txt
的内容。之后,现在由第 1 行和第 2 行组成的图案空间仅在循环结束时打印出来)- 当然,如果您使用的是脚本,则可能不需要备份和重置
IFS
。