【问题标题】:IF statement for different lines [closed]不同行的 IF 语句[关闭]
【发布时间】:2019-02-21 16:29:00
【问题描述】:

问题很简单,但我找不到快速优雅的解决方法。

接下来我要决定:如果文件的块大小超过 6,那么我应该打印文件名。

stat a.txt b.txt | awk '/Blocks/ {print $4} /File/ {print $2}'

此代码返回

'a.txt'
3
'b.txt'
10

但如果我使用NR==...,它会使用文件名削减行。

【问题讨论】:

  • 我已经添加了一个答案,但有助于澄清的是您想要的输出是什么。一点都不清楚。
  • edit 您的问题包括您的 stat 命令的示例输出以及您的 awk 命令的预期输出,作为输入,我们可以为您提供帮助。

标签: linux shell unix awk command-line


【解决方案1】:

类似:

stat a.txt b.txt | awk '/File/{filename=$2} $1~/Size/ && $4>6 {print filename, $2}`

我们将文件名捕获到变量filename,然后如果我们找到Size 行并且第二列大于6,我们打印文件名和块大小。

不过,我有点猜你在找什么。

【讨论】:

    【解决方案2】:

    您可以格式化stat 的输出以使处理更容易(需要GNU stat):

    stat -c '%b %n' a.txt b.txt | awk '$1 > 6 {print $2}'
    

    在哪里(摘自man page

    %b分配的块数
    %n文件名

    或者,如果您的文件名包含特殊字符,您可以使用引号将它们打印出来:

    stat -c '%b %N'
    

    在哪里

    %N 引用文件名,如果符号链接取消引用

    【讨论】:

      【解决方案3】:

      解析stat 好的输出并为此使用awk 对我来说似乎不是最好的解决方案。 stat 有输出 printf 修饰符,你可以只打印你需要的信息。

      这里我使用 find 和 xargs 并进行一些 shell 比较:

      find a.txt b.txt -printf "%b\0%f\0" | xargs -0 -n2 -- sh -c '[ "$1" -gt 6 ] && echo "$2"' --
      

      或者如果你需要统计:

      stat a.txt b.txt --printf="%b\0%n\0" | xargs -0 -n2 -- sh -c '[ "$1" -gt 6 ] && echo "$2"' --
      

      但如果您不需要处理文件名中的所有字符,也许这就足够了:

      stat a.txt b.txt --printf="%b %n\n" | awk '{$1>6}1' | cut -d' ' -f2
      

      或多 awk 少切:

      stat a.txt b.txt --printf="%b %n\n" | awk '{if ($1>6) { print $2; }}'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-05
        • 1970-01-01
        • 1970-01-01
        • 2016-10-15
        • 2017-05-24
        • 2014-10-21
        • 1970-01-01
        相关资源
        最近更新 更多