Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用awk在小脚本中将月份从Aaa转换为xx_Awk_Type Conversion - Fatal编程技术网

使用awk在小脚本中将月份从Aaa转换为xx

使用awk在小脚本中将月份从Aaa转换为xx,awk,type-conversion,Awk,Type Conversion,我试图报告每个日期创建的文件数。我可以用这个小小的一行: ls -la foo*.bar|awk '{print $7, $6}'|sort|uniq -c 我得到了一个列表,列出了截止日期创建了多少fooxxx.bar文件,但月份的格式是:Aaa(即:Apr),我想要xx(即:04) 我觉得答案就在这里: awk ' BEGIN{ m=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",d,"|") for(o=1;o&

我试图报告每个日期创建的文件数。我可以用这个小小的一行:

ls -la foo*.bar|awk '{print $7, $6}'|sort|uniq -c
我得到了一个列表,列出了截止日期创建了多少fooxxx.bar文件,但月份的格式是:Aaa(即:Apr),我想要xx(即:04)

我觉得答案就在这里:

awk '
BEGIN{
   m=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",d,"|")
   for(o=1;o<=m;o++){
      months[d[o]]=sprintf("%02d",o)
    }
format = "%m/%d/%Y %H:%M"
}
{
split($4,time,":")
date = (strftime("%Y") " " months[$2] " " $3 " " time[1] " " time[2] " 0")
print strftime(format, mktime(date))
}'
awk'
开始{
m=拆分(“1月| 2月| 3月| 4月| 5月| 6月| 7月| 8月| 9月| 10月| 11月| 12日”,d,”)

对于(o=1;o只需使用您月份的字段号作为
months
数组的索引即可

print months[$6]
由于
ls
输出因系统而异,有时在同一个系统上取决于文件年限,而且您没有给出任何示例,因此我无法知道如何进一步指导您


哦,还有。

假设月份的名称只出现在“月份”列中,那么您可以执行以下操作:

ls -la foo*.bar|awk '{sub(/Jan/,"01");sub(/Feb/,"02");print $7, $6}'|sort|uniq -c

以下是在awk中将缩写月份名称转换为数字的惯用方法:

$ echo "Feb" | awk '{printf "%02d\n",(index("JanFebMarAprMayJunJulAugSepOctNovDec",$0)+2)/3}'
02

$ echo "May" | awk '{printf "%02d\n",(index("JanFebMarAprMayJunJulAugSepOctNovDec",$0)+2)/3}'
05

如果您需要更多信息来解决问题,请告诉我们。

要解析AIX istat,我使用:

istat .profile | grep "^Last modified" | read dummy dummy dummy  mon day time dummy yr dummy
echo "M: $mon D: $day T: $time Y: $yr"
-> Month: Mar Day: 12 Time: 12:05:36 Year: 2012
为了解析AIX istat month,我使用以下两行AIX 6.1 ksh 88:

monstr="???JanFebMarAprMayJunJulAugSepOctNovDec???"
mon="Oct" ; hugo=${monstr%${mon}*} ; hugolen=${#hugo} ; let hugol=hugolen/3 ; echo "Month: $hugol"
-> Month: 10
1..12:月份名称确定

如果lt 1或gt 12:月份名称不正常


不要使用“hugo”,而是使用会说话的名称;-)

添加一个AIX版本,该版本显示如何检索所有日期元素(在您需要的任何时区中),并显示iso8601输出

tempTZ="UTC" ; TZ="$tempTZ" istat /path/to/somefile \
| grep modified \
| awk -v tmpTZ="$tempTZ" '
   BEGIN {Mmms="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"; 
          n=split(Mmms,Mmm," ") ; 
          for(i=1;i<=n;i++){ mm[Mmm[i]]=sprintf("%02d",i) } 
   }
         { printf("%s-%s-%sT%s %s",$NF, mm[$4], $5, $6, tmpTZ )  }
  ' ## this will output an iso8601 date of the modification date of that file, 
    ## for ex: 2019-04-18T14:16:05 UTC 
 ## you can tempTZ=anything, for ex: tempTZ="UTC+2" to see that date in UTC+2 timezone... or tempTZ="EST" , etc
attez=“UTC”;TZ=“$attez”istat/path/to/somefile\
|格雷普修改\
|awk-v tmpTZ=“$TENTZ””
开始{Mmms=“一月-二月-三月-四月-五月-六月-七月-八月-九月-十月-十一月-十二月”;
n=拆分(毫米,毫米,“”);

对于(i=1;i.你想要获得文件时间,其美妙之处在于你可以根据自己的喜好直接设置日期的格式。详细说明@DennisWilliamson great Advisor:ls-l根据文件的“年龄”显示不同的内容:如果文件/dir超过一年,超过6个月,字段代表发送不同的内容,等等imes$7将不包含Mmm信息。使用stat是最好的,但在一些没有它的非常旧的系统上,非常旧的操作系统上的一个非常脏(+慢)的技巧是解析
tar cf-file | tar tvf-| head-1
(tar字段更加一致,并且不随文件的年龄而变化)。使用stat(或一些perl foo)对文件的更新更好、更快、更合适。我们正在监视存储在旋转tar文件中的web内容文件的更改。文件的更新时间永远不会超过3或4个月。随着较旧的tar文件变得稀疏,它们将被“优化”我确信还有其他方法可以做到这一点,但我认为使用awk是优雅的(而且比cut好得多)。我可以使用case编写Aaa到xx月的转换脚本,但是如果可能的话,我不确定在哪里执行,因为我将字段号放入了月数组的索引中。@SherpaPsy:您的系统是否有
stat
?它是什么操作系统(和版本/发行版)?AIX6.1-可以使用istat,但我认为该输出将更难解析!@SherpaPsy:的确:在Aix上:
TZ=UTC istat/somefile | grep-modified | awk'BEGIN{Mmms=“Jan-Feb-Mar-Apr-May-Jun-Jul-Aug-Sep-Oct-Nov-Dec”;n=split(Mmms,Mmm,“);for(I=1;I=1;I