ファイル名に応じてファイルの内容を変更するスクリプトを用意したいと思います。
ファイル名がありABC_20161027220153.txt
、ファイルの内容が次のようになっているとします。
2000|2000_ABC|04|||0000000000||
以下のようにファイルの内容を変更するスクリプトを作りたい
2000|2000_ABC|04|20161027|27.10.2016 22.01.53|0000000000||
これどうやってするの?
答え1
これにはいくつかの手順がありました:
- awkは変数内の現在のファイル名を知っている
FILENAME
- ファイル名をデコードされた要素に分割していない場合 (ここでは各新しい入力ファイルの最初の行で分割するようにハードコードされています)、関数を使用して分割を
substr
支援します。 - それぞれの入力行は、ステートメント
|
によってシンボルごとに分割されておりBEGIN
、フィールド4と5を新しい値に置き換えます。 - 再構築された行を印刷する
すべてをまとめると(「abc.awk」という名前を付けました):
BEGIN { OFS=FS="|" }
{
if (FNR == 1) {
f4=substr(FILENAME, index(FILENAME, "_") + 1, 8);
f5a=substr(FILENAME, index(FILENAME, "_") + 9, 6);
f5=substr(f4, 7, 2) "." substr(f4, 5, 2) "." substr(f4, 1, 4) " " \
substr(f5a, 1, 2) "." substr(f5a, 3, 2) "." substr(f5a, 5, 2);
}
$4=f4
$5=f5
print $0
}
$ awk -f abc.awk ABC_20161027220153.txt
2000|2000_ABC|04|20161027|27.10.2016 22.01.53|0000000000||