如何将信息分离到输入和输出中的字段中?

如何将信息分离到输入和输出中的字段中?
$ 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

我尝试设置输入和输出字段分隔符。

  • 我使用#作为输入分隔符,但文件名可以包含#.还有更好的选择吗?我不知道是否可以按asstat分隔输出路径名以及是否可以接受输入字段分隔符。/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'/'

正如评论中已经指出的@steeldriver,您有两种选择输出字段分隔符的方法。

  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}'

相关内容