このスレッドの主な目的は、非GNUでSAVEをインプレースする方法なawk
ので、最初にそのテンプレートを投稿します。これは、あらゆる種類の要件に役立つため、メインブロックを維持しながら、コードに追加/追加しBEGIN
、END
セクションを追加する必要があります。要件とそれはインプレース編集を行う必要があります:
注:以下を実行すると、すべての出力がoutput_fileに書き込まれます。そのため、標準出力に何か出力したい場合は、以下のprint...
ステートメントを追加しない> (out)
でください。
一般的なテンプレート:
awk -v out_file="out" '
FNR==1{
close(out)
out=out_file count++
rename=(rename?rename ORS:"") "mv \047" out "\047 \047" FILENAME "\047"
}
{
.....your main block code.....
}
END{
if(rename){
system(rename)
}
}
' *.txt
特定の提供されたサンプルのソリューション:
私はawk
それ自体の中で以下のアプローチを考え出しました(追加されたサンプルについては、これを解決して出力をInput_file自体に保存するための私のアプローチです)
awk -v out_file="out" '
FNR==1{
close(out)
out=out_file count++
rename=(rename?rename ORS:"") "mv \047" out "\047 \047" FILENAME "\047"
}
{
print FNR > (out)
}
END{
if(rename){
system(rename)
}
}
' *.txt
注:これは、編集された出力をInput_file(s)自体に保存するためのテストにすぎません。プログラムのBEGINセクションとENDセクションを使用できます。メインセクションは、特定の質問自体の要件に従ってください。
公正な警告:また、このアプローチはパスに新しい一時出力ファイルを作成するので、システムに十分なスペースがあることを確認してください。ただし、最終的な結果では、メインのInput_fileのみが保持されますが、操作中はシステム/ディレクトリにスペースが必要です。
以下は、上記のコードのテストです。
例を使用したプログラムの実行:以下が.txt
Input_file(s)であると仮定しましょう:
cat << EOF > test1.txt
onetwo three
tets testtest
EOF
cat << EOF > test2.txt
onetwo three
tets testtest
EOF
cat << EOF > test3.txt
onetwo three
tets testtest
EOF
次のコードを実行すると、
awk -v out_file="out" '
FNR==1{
close(out)
out=out_file count++
rename=(rename?rename ORS:"") "mv \047" out "\047 \047" FILENAME "\047"
}
{
print "new_lines_here...." > (out)
}
END{
if(rename){
system("ls -lhtr;" rename)
}
}
' *.txt
注:後で出力ファイルの名前を実際の名前に変更するためls -lhtr
、system
セクションに意図的に配置して、作成中の出力ファイル(一時ベース)を確認します。
-rw-r--r-- 1 runner runner 27 Dec 9 05:33 test2.txt
-rw-r--r-- 1 runner runner 27 Dec 9 05:33 test1.txt
-rw-r--r-- 1 runner runner 27 Dec 9 05:33 test3.txt
-rw-r--r-- 1 runner runner 38 Dec 9 05:33 out2
-rw-r--r-- 1 runner runner 38 Dec 9 05:33 out1
-rw-r--r-- 1 runner runner 38 Dec 9 05:33 out0
私たちが行うとls -lhtr
した後、awk
スクリプトを実行して行われ、我々は見ることができ.txt
、そこにファイルを。
-rw-r--r-- 1 runner runner 27 Dec 9 05:33 test2.txt
-rw-r--r-- 1 runner runner 27 Dec 9 05:33 test1.txt
-rw-r--r-- 1 runner runner 27 Dec 9 05:33 test3.txt
説明:上記のコマンドの詳細な説明をここに追加します:
awk -v out_file="out" ' ##Starting awk program from here, creating a variable named out_file whose value SHOULD BE a name of files which are NOT present in our current directory. Basically by this name temporary files will be created which will be later renamed to actual files.
FNR==1{ ##Checking condition if this is very first line of current Input_file then do following.
close(out) ##Using close function of awk here, because we are putting output to temp files and then renaming them so making sure that we shouldn't get too many files opened error by CLOSING it.
out=out_file count++ ##Creating out variable here, whose value is value of variable out_file(defined in awk -v section) then variable count whose value will be keep increment with 1 whenever cursor comes here.
rename=(rename?rename ORS:"") "mv \047" out "\047 \047" FILENAME "\047" ##Creating a variable named rename, whose work is to execute commands(rename ones) once we are done with processing all the Input_file(s), this will be executed in END section.
} ##Closing BLOCK for FNR==1 condition here.
{ ##Starting main BLOCK from here.
print "new_lines_here...." > (out) ##Doing printing in this example to out file.
} ##Closing main BLOCK here.
END{ ##Starting END block for this specific program here.
if(rename){ ##Checking condition if rename variable is NOT NULL then do following.
system(rename) ##Using system command and placing renme variable inside which will actually execute mv commands to rename files from out01 etc to Input_file etc.
}
} ##Closing END block of this program here.
' *.txt ##Mentioning Input_file(s) with their extensions here.