【问题标题】:Last Occurrence of Character Field Separator AWK字符字段分隔符 AWK 的最后一次出现
【发布时间】:2012-04-25 00:07:13
【问题描述】:

我正在使用查找命令来查找某种格式的所有文件,该命令已经很好了。我正在将该输出通过管道传输到 awk 命令中,并且我想使用最后一个下划线作为字段分隔符。问题在于,根据文件所在的路径,事实之前可能会有一两个下划线。

find . -regex ".*prob[0-9]*_.*" | awk 'BEGIN { FS = "_.*$" } { print $1 " " $2 }'

我知道我的字段分隔符中的正则表达式有什么问题,它认为用下划线分隔,后面的任何内容,是否只指定单个字符本身。此外,我如何专门在最后一次出现的字符上使用字段分隔符。

这在某种程度上是我之前提出的一个问题的延伸: Suppress output to StdOut when piping echo

我得到的文件通常是这样的,皱纹是目录也可以有下划线: /the/directory/probXXXXX_XX

其中 X 是任意整数。

我一直在考虑的一种解决方法是在每个下划线处分开,然后打印每一列...不过我更希望它在上面的方法中工作。

【问题讨论】:

  • 鉴于目前正在做的事情,您认为如何将分配给FS 修改为仅_
  • 你是什么意思?我可以使用 FS = "_",但是这样会分隔一个额外的下划线并创建一个我不想要的列。我只想分隔最后一个下划线。
  • 答案的其余部分见下文。

标签: regex bash awk find


【解决方案1】:

awk 的一个不明显的技巧是$ 是一个运算符;您可以将它与变量甚至表达式一起使用,尤其是与涉及预定义变量 NF 的表达式一起使用:$NF 获取最后一个字段,$(NF - 1) 获取倒数第二个字段。

【讨论】:

  • 我不确定这将如何帮助我区分最后一个下划线。我知道我可以使用 $NF 来引用最后一列,但该列没有正确分开。我正在摆弄循环,在每个下划线上分隔,然后将 fomr 1 循环到 NF 并打印,但这一次显示一行。 for (i=1; i <= NF; i++) print $i 编辑:还是我只需要在我的正则表达式上转义 $(我正在尝试这个)
  • 如果您设置FS = "_",那么列将被正确分隔或"_" 实际上不是列分隔符。至于另一个,print 包含换行符;使用printf 来避免它。
  • 好吧,好吧,现在我又遇到了另一个问题(高兴),这取决于记录的数量(大多数情况下可能有 2 或 3 条)我无法正确格式化所有内容。使用模运算,我检查每第 n 条记录,然后打印新行,我几乎可以让它工作了。有没有办法计算awk中字符串中的字符数?记录 $0,整个字符串,我想计算其中的下划线数量,减 1 是在我想打印换行符的记录数之后
  • 如果你设置了FS = "_",那么NF就是字段的个数,也就是下划线的个数加1。如果你想为其他字符做,最简单的方法可能是对split() 的结果使用相同的技巧。
  • 嗯,就是这样,今天逻辑简直是在逃避我。我需要向我的显示器道歉......我可能会或可能不会对它尖叫
猜你喜欢
  • 2015-04-23
  • 2016-05-27
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 2019-01-06
相关资源
最近更新 更多