現在、awkのデリミタの指定と、フィールドのカウント方法について悩んでいます。
現在、デジカメの画像ファイルのファイル名を、通番から撮影した日に変更するコマンドをawkで作成しています。(環境はcygwinです)
具体的には以下のようなlsの出力を利用して、
% ls --full-time -rwxrwx---+ 1 user None 814420 2017-08-12 14:31:16.000000000 +0900 CIMG1954.JPG -rwxrwx---+ 1 user None 1021175 2017-08-13 17:02:14.000000000 +0900 CIMG1955.JPG -rwxrwx---+ 1 user None 1010903 2017-08-12 14:31:40.000000000 +0900 CIMG1956.JPG -rwxrwx---+ 1 user None 924994 2017-08-12 14:31:46.000000000 +0900 CIMG1957.JPG -rwxrwx---+ 1 user None 1088210 2017-08-12 14:32:48.000000000 +0900 CIMG1958.JPG -rwxrwx---+ 1 user None 1358633 2017-08-12 14:32:54.000000000 +0900 CIMG1959.JPG
以下のようなフォーマットに変換して、スクリプトを生成する出力を得ようとしています。
mv CIMG1991.JPG "2017-08-12 14:44:48.JPG" mv CIMG1992.JPG "2017-08-12 14:44:56.JPG" mv CIMG1994.JPG "2017-08-12 14:45:16.JPG" mv CIMG1995.JPG "2017-08-12 14:46:14.JPG" mv CIMG1996.JPG "2017-08-12 14:46:34.JPG" mv CIMG1997.JPG "2017-08-12 14:49:28.JPG"
そのためのコマンドが以下の通りです。
デリミタには-Fオプションを使って、空白文字とピリオドの2つを指定しています。
% ls --full-time | awk -F "[. ]" '{ print "mv " $10 "." $11 " \"" $6 " " $7 "." $11 "\"" ;}'
ですが、実際に上記のコマンドを実行すると、ファイルサイズによって出力がまちまちになって困っています。
具体的には、ファイルサイズが1MB以下のファイルでフィールドの順番が狂うようで、以下のような出力になります。
-rwxrwx---+ 1 user None 1021175 2017-08-13 17:02:14.000000000 +0900 CIMG1955.JPG -rwxrwx---+ 1 user None 1010903 2017-08-12 14:31:40.000000000 +0900 CIMG1956.JPG -rwxrwx---+ 1 user None 924994 2017-08-12 14:31:46.000000000 +0900 CIMG1957.JPG ↓ ↑デリミタ(スペース)が2つある ↓ mv CIMG1955.JPG "2017-08-13 17:02:14.JPG" mv CIMG1956.JPG "2017-08-12 14:31:40.JPG" mv +0900.CIMG1957 "924994 2017-08-12.CIMG1957" ←期待していない出力になる
ポイントになるのは、最後のファイルが1MB以下のため、グループとサイズの間に、スペースが2つあることだと推測しています。(他のファイルも全て同じ症状です)
ただ、私の知っている範囲では、awkの仕様ではデリミタが複数続いても、それ全体を1つのデリミタとしてカウントするように思っています。
具体的には以下の通りです。
% echo a b | awk -F' ' '{print $2;}' ←aとbの間には2つのスペースがあるが、、、 b ←bは2番目のフィールドとして認識されている
推測ですが、awkはデリミタが単数の場合と、複数の場合では、フィールドのカウント方法が変わる仕様のような気がしています。
(いろいろと調べましたが、確定的な答えは得られませんでした)
なんとか期待通りの出力を得ようとして半分適当にいろいろと試してみたのですが、当初の目的をいまだに果たせずにいます。
どのようなコマンドを書いたらよろしいでしょうか。
awkのバージョンは以下の通りです。
% awk -V GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5, GNU MP 6.1.2) Copyright (C) 1989, 1991-2016 Free Software Foundation.
ご助言いただければ幸いです。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/13 12:58
2017/08/13 13:44
2017/08/18 01:00
2017/08/18 03:40
2017/08/18 08:09