Bash脚本扫描文件夹并删除每个文件中的零

时间:2016-09-13 08:19:23

标签: bash for-loop recursion zero-pad

我有一个由68个文件(.txt文件)组成的文件夹,其中38个文件从第四行开始到第三列结束为零。

我想使用bash脚本从文件中删除所有零。

.txt文件采用以下格式(我附上了我目录中前三个文件的图片),你可以看到为每个文件添加了一个新的行,并添加了额外的零个数。

下面列出了几个文件的例子

regional_vol_GM_atlas1.txt

667869 667869.000000 
580083 580083.000000 
316133 316133.000000



regional_vol_GM_atlas2.txt

667869 667869.000000 
580083 580083.000000 
316133 316133.000000 
0 0.000000 
9020 9020.000000  
11065 11065.000000 



 regional_vol_GM_atlas3.txt

667869 667869.000000 
580083 580083.000000 
316133 316133.000000 
0 0.000000 
0 0.000000 
11651 11651.000000 

regional_vol_GM_atlas3.txt

667869 667869.000000 
580083 580083.000000 
316133 316133.000000 
0 0.000000 
0 0.000000 
0 0.000000 
12706 12706.000000 

对于第38个文件,从第3行开始填充37行零,如何通过脚本删除它们?目录中所有文件的通用文件格式为regional_vol_GM_atlas * .txt

1 个答案:

答案 0 :(得分:1)

从第3行删除0 0.0000之类的行,并删除最后一个字段的零(和点),如下所示:

sed -i -e '3,$ {/0 0\.0\+/d;}' -e 's/\.0\+ *$//' regional*txt

之前:

4536 23452345.0000
0 0.0000

后:

4536 23452345

(该行末尾的点+ 1或更多零,更改为“无”)

警告:这是“就地”。在尝试之前进行备份。它不计算有多少列。如果这是一个问题,则应使用awk

(不像这样进行测试:sed -e '3,$ {/0 0\.0\+/d;}' -e 's/\.0\+ *$//' one_of_your_files.txt

递归情况:如果文件在几个子目录中,则对sed命令的结果应用find

sed -e '3,$ {/0 0\.0\+/d;}' -e 's/\.0\+ *$//' $(find subdir_root -type f -name "regional*.txt")