2011-12-15 8 views
-1

現在のディレクトリ内のすべてのtxtファイルを取得するシェルスクリプトが必要で、ファイルごとに空のファイルか、それは(私はwcコマンドで行うことができると信じています)。unixファイルの最後の行の最初の文字をファイル名に置き換えるには

それが空の場合、ファイルの最後の行は次のようになりますここで私たちの状態で、このディレクトリ内のすべてのtxtファイルが空であるか、膨大なデータが含まれていますいずれかのため、その後、他のそれを無視:

Z|11|21|||||||||| 

最後の行には、文字Zがあり、次に|、次にan integer、次に|、次にan integer、ある数字の|があります。

ファイルが空でない場合は、この形式になっていると見なします。最後の行の前のデータは文字化けしており、必要ではありませんが、最後の行の前に少なくとも1行あります。つまり、ファイルが空でない場合は少なくとも2行は保証されます。

ファイルが空でない場合、ファイルを受け取り、最後の行の 'Z'を 'filename.txt'に置き換えて、新しいデータを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内のデータは次のとおりです。このマージした後、TEMP.TXT内のデータはFILE2.TXTの
新しいデータをクリア。これは、に書き込まれます

... 
... 
... 
file2.txt|2|34|||||| 

なっている

file1.txt|1|1|||||| 

同じファイルtemp.txt。そこから最後の行が同じファイルfinal.txtにマージされます。
ので、final.txt内のデータはタイプTXTと非空のと同じディレクトリ内にあることが返されたファイルのN番号、最終的にデータを検討した後

file1.txt|1|1|||||| 
file2.txt|2|34|||||| 

です。TXTは、いくつかの条件については

file1.txt|1|1|||||| 
file2.txt|2|34|||||| 
file3.txt|8|3|||||| 
....... 
....... 
....... 
fileN.txt|22|3||||| 

になり、私はすでにコマンドを知って、text型のディレクトリ内のファイルを見つけるための
、最後の行を取り、にそれをマージする

find <directory> -type f -name "*.txt" 

のような別のファイル

tail -1 file.txt>>destination.txt 
+0

誰かが自分の仕事をするように頼んでいるように聞こえます。もしそうなら、あなたは解決策にどれだけお金を払うでしょうか?そうでない場合は、下記のいくつかの基本的なbashコードです。 'findのファイル名は –

答えて

1

"sed"を使用して "z"文字を置き換えることができます。ループしているので、そのファイル名を使用することができます。これは単にZを削除してから、行とファイル名をエコーし​​ます。

幸運。

#!/bin/bash 
filename=test.txt 
line=`tail -1 $filename | sed "s/Z/$filename/"` 
echo $line 

編集:

あなたが最初にあなたのfindのコマンドを実行し、出力を見ましたか?もちろん、各行の先頭には./があります。それはsedが区切り文字として/を使用するので、sedを破棄します。また、ファイル名の前に余分な "/"が付いていない問題文では動作しません。あなたは現在のディレクトリを言いました。あなたが与えたコマンドはALLサブディレクトリを横切ります。シンプルでLSを使ってみてください。

+0

です。 "$。"ファイル名の末尾に "0"を付けてください。 – Ashish

+0

ループがなければ、上記のコマンドは完全に動作します。 。 ループ内で動作しません。 'findのファイル名は です。 -type fが-name "* .TXT" ' ライン='尾-1 $ファイル名でください| sedの "S/Z/$ファイル名/" ' エコー$行 は 出力された行わ: はsedをします。Function s/Z /./ bk1.txt /は解析できません。 sed:関数s/Z /./bk2.txt/は解析できません。 sed:関数s/Z /./bk3.txt/は解析できません。 Findコマンドは./bk1.txt、./bk2.txtなどのファイル名を返します。変数filenameを使用するとどこでもファイルの内容にアクセスできますが、ファイル名自体を入力することはできません – Ashish

+0

はファイル名のように聞こえますcurrrentディレクトリ "./" –

関連する問題