情報を入力フィールドと出力フィールドに分割するには?

情報を入力フィールドと出力フィールドに分割するには?
$ stat -c "%Y#%n#%y" *  | awk -F'#' "BEGIN {OFS=\"|\"} NR==1,NR==3 {print \$2 \$3}"
directory1/Blum2017-12-22 22:33:38.644178442 -0500
dir2/Ciolli2017-12-22 21:53:51.769368496 -0500
Dar2017-12-06 13:29:37.698296879 -0500

入力フィールドと出力フィールドの区切り文字を設定しようとしています。

  • 入力区切り文字として使用していますが、#ファイル名に#stat出力パス名をasで区切ることができるのか、入力フィールドの区切り文字が許可されているのかはわかりません。/nullfindawk\null

  • 私の設定がうまくいかないOFSのはなぜですか|

ありがとうございます。

答え1

stat -c "%Y/%n/%y" * | awk -F'/' 'NR==1,NR==3 {print $2"|"$3}'

または:

stat -c "%Y/%n/%y" * | awk -F'/' 'BEGIN {OFS="|"} NR==1,NR==3 {print $2,$3}'

説明する:

#/(ディレクトリ区切り文字)はファイル名の一部にはできないため、代わりに使用できます。

入力awkフィールドの区切り記号はそれに応じて設定する必要があります-F'/'

すでにコメントで指摘したように、@スチールドライバでは、出力フィールド区切り文字を選択する2つの方法があります。

  1. 文字列接続の使用: print $2"|"$3
  2. OFS="|"次に定義しますprint $2,$3

私は二重引用符の'代わりに一重引用符を選択しました"。これにより、この場合エスケープの必要性が減ります。

修正する:

これで、質問はstat出力にディレクトリ区切り文字を含めることができることを指定するので、/レコード区切り文字の賢明な選択ではありません。私が知る限り、ファイル名に許されない唯一の文字はですがNUL、少なくともこの場合にはその使用に問題があります。私の提案は、ファイル名の一部として見つかる可能性がない(許可されますが)厄介な文字列を構築することです。驚くべきことに\x0(の表現NUL)が良い選択かもしれません。

stat -c "%Y\x0%n\x0%y" * | awk -F\x0 'BEGIN {OFS="|"} NR==1,NR==3 {print $2"|"$3}'

関連情報