【问题标题】:AWK output formatting and syntaxAWK 输出格式和语法
【发布时间】:2010-08-28 18:12:35
【问题描述】:

我一直在尝试使用 AWK 对输出进行分类,并且非常成功地解决了堆栈溢出的一些问题,直到我点击了下面命令的最后一部分。

-bash-3.2$ find /home/username/www/devdir -mindepth 2 -maxdepth 2 -type d -printf "%TY %Tm %Tb %Td,%TH:%TM,%p,\n" | grep "^$r" | grep Aug | sort -r | awk -F '/' '{print $1,$6","$7}' | awk -F " " '$1, { for (i=3; i<=NF; i++) printf("%s ", $i); printf("\n"); }' | head -10
awk: $1, { for (i=3; i<=NF; i++) printf("%s ", $i); printf("\n"); }
awk:     ^ syntax error

输出如下所示:

2010 08 Aug 28,11:51, Directory Tom,005,
2010 08 Aug 28,11:50, Directory Smith,004,
2010 08 Aug 28,11:46, Directory Jon,003,

我希望它看起来像:

2010 Aug 28,11:51, Directory Tom,005,
2010 Aug 28,11:50, Directory Smith,004,
2010 Aug 28,11:46, Directory Jon,003,

我想去掉“08”,有时又不会丢失之前完成的排序。这将更改为下个月的 09 和以下的 10,我相信我可以使用 sed 来解决这个问题,但是我不是它的专家。有人可以说明我应该做些什么来克服这个障碍吗?

我参考了这个问题来了解我需要做什么:Sorting output with awk, and formatting it

【问题讨论】:

    标签: linux syntax awk printf


    【解决方案1】:

    这部分到底想做什么?

    awk -F " " '$1, { }'
    

    我的意思是 1 美元,...

    关于更新:

    sed 's/^\([0-9]\+\) 08 \(.\+\)$/\1 \2/'
    

    应该删掉这个。

    或更通用的:

    sed 's/^\([0-9]\+\) [0-9][0-9] \(.\+\)$/\1 \2/'
    

    【讨论】:

    • 我要保留年份(2010)。
    • 我更新了我的问题以阐明我希望输出的样子。
    【解决方案2】:

    您可以将 grep 合并为一个,并将所有 awk、sed 和 head 合并为一个 awk 脚本。由于您只计算一个月和一年,因此您不需要在find 中包含%Tm,并且您实际上只按月份和时间进行排序。我假设$r 是年份。

    大约:

    find /home/username/www/devdir -mindepth 2 -maxdepth 2 -type d -printf "%TY %Tb %Td,%TH:%TM,%p,\n" | grep "^$r.*Aug" | sort -r | awk -F '/' 'NR<=10{print $1,$6","$7}'
    

    顺便说一下,你将如何做你打算做的事情:

    printf($1" ");for (i=3; i<=NF; i++) printf("%s ", $i); printf("\n")
    

    您将显式打印第一个字段,而不是通过引用包含它。但是,使用我上面的建议,您不需要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      相关资源
      最近更新 更多