不同行的IF语句

时间:2018-09-17 17:28:20

标签: linux shell unix awk command-line

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

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

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

此代码返回

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

但是,如果我使用NR==...,则会使用文件名剪切行。

3 个答案:

答案 0 :(得分:3)

您可以格式化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用引号引起来的文件名(如果使用符号链接则取消引用)

答案 1 :(得分:0)

类似的东西:

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

在将文件名捕获到变量filename的位置,然后如果发现Size行并且第二列大于6,则打印文件名和块大小。

我有点在想你在找什么。

答案 2 :(得分:0)

解析stat很好的输出并为此使用awk似乎不是我的最佳解决方案。 stat具有输出printf修饰符,您可以仅打印所需的信息。

在这里,我将find与xargs一起使用,并进行了一些外壳比较:

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

减少切割幅度或更多:

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