0

68 個のファイル (.txt ファイル) で構成されるフォルダーがあり、そのうち 38 個のファイルには 4 行目から 3 列目までがゼロです。

bash スクリプトを使用して、ファイルからすべてのゼロを削除したいと考えています。

.txt ファイルの形式は次のとおりです (ディレクトリ内の最初の 3 つのファイルの写真を添付し​​ています)。ファイルごとに、ゼロの数が追加された新しい行が追加されていることがわかります。

ファイルのいくつかの例を以下に示します

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 です。

4

1 に答える 1

1

0 0.0000次のように、最後のフィールドの 3 行目と末尾のゼロ (およびドット) から次のような行を削除します。

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")
于 2016-09-13T08:23:58.953 に答える