2012-11-17 58 views
2

我在文件夹中有数千个带有编码天气信息的文件。对于每个需要添加控制字符的页眉和页脚的文件。这不是问题,因为我在单独的文件中使用了页眉和页脚(通过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 

我检查了网络,并测试了一些我自己的想法 - 用awksed - 但我真的不能找到任何如何以简单的方式实现这一目标的合适方式。所以,我将不胜感激一些帮助或提示如何进行。

回答

3
while IFS= read -r file; do 
    cat header.txt "$file" footer.txt > newfile && mv newfile "$file" 
done < list_of_files_to_decode.txt 

解释

  • 我简单地使用级联和shell重定向
  • &&是一条捷径。这是一样的if condition; then action; fi
+3

当然,如果文件名中有空格,就会失败! –

+0

是的,后编辑相应 –

+0

相应地增加了“+ 1”';-)' –

0

比较安全的方法是重命名原始文件第一

mv $file $file.orig 
cat header $file.orig footer > $file && rm $file.orig 

反之亦然创建一个新的文件,然后覆盖原来的

cat header $file footer > $file.new && mv -f $file.new $file 
+0

这比我预料的更简单。我已经测试过,效果很好。 非常感谢。 –

+0

总是引用你的变量,除非你有一个非常好的,明确的理由不要。 'mv $ file $ file.orig'与'mv“$ file”“$ {file} .orig”'非常不同,几乎肯定不是你想要的。 –

0

无回路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只有在文件名
  • 空间来换行的情况下,
  • 文件在阅读下一行
  • 1 N防止第一线从所述内容之前得到印刷r打印内容的header.txt

    (细节:它读取第2行并追加到模式空间,触发r到打印出header.txt的内容。之后,现在由第1行和第2行组成的模式空间仅在循环结束时打印出来)

  • 当然,如果使用脚本,备份和重置IFS可能不是必需的。
+0

总是引用你的变量,除非你有一个非常好的,明确的理由不要。 IFS = $ OLDIFS与IFS =“$ OLDIFS”非常不同,几乎肯定不是您想要的。 –

+0

除非涉及命令替换,否则分词不会发生。 – doubleDown

+0

这不仅仅是您需要担心的单词分割(请参阅http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions),但看起来您是正确的,并且在分配时将变量不加引号保留是安全的。之前从未注意过,因为我总是引用我的变量,除非我有一个非常具体的原因不去。在其他时间节省惊奇。 –

相关问题